2012-12-05 22 views
30

Mam pewne problemy z funkcją PHP str_replace podczas korzystania z tablic.str_replace z tablicą

mam komunikat:

$message = strtolower("L rzzo rwldd ty esp mtdsza'd szdepw ty esp opgtw'd dple"); 

I staram się używać str_replace takiego:

$new_message = str_replace(
    array('l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','a','b','c','d','e','f','g','h','i','j','k'), 
    array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'), 
    $message); 

Wynik powinien być A good glass in the bishop's hostel in the devil's seat, ale zamiast tego mam p voos vlpss xn twt qxswop's wosttl xn twt stvxl's stpt.

Jednak, kiedy tylko spróbuj wymienić 2 litery zastępuje je dobrze:

$new_message = str_replace(array('l','p'), array('a','e'), $message); 

litery l i p zostaną zastąpione przez a i e.

Dlaczego nie działa z pełną tablicą alfabetyczną, jeśli oba mają dokładnie taki sam rozmiar?

Odpowiedz

28

str_replace z tablicami po prostu wykonuje wszystkie zamienniki sekwencyjnie. Użyj strtr zamiast robić je wszystkie na raz:

$new_message = strtr($message, 'lmnopq...', 'abcdef...'); 
+1

Uwaga, można dokonać tej pracy w dużych i małych liter po prostu wykonując '$ new_message = strtr ('lmnopqrstuvwxyzabcdefghijkLMNOPQRSTUVWXYZABCDEFGHIJK', 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $ message);' –

+0

@TheSmose dzięki, ja dodałem to również! – LautaroAngelico

33

Ponieważ str_replace() zastępuje lewej do prawej, to może zastąpić wcześniej wstawione wartości robiąc wiele zamienników.

 
    // Outputs F because A is replaced with B, then B is replaced with C, and so on... 
    // Finally E is replaced with F, because of left to right replacements. 
    $search = array('A', 'B', 'C', 'D', 'E'); 
    $replace = array('B', 'C', 'D', 'E', 'F'); 
    $subject = 'A'; 
    echo str_replace($search, $replace, $subject); 
+0

To nie dostarcza więcej informacji, niż podano już w drugiej odpowiedzi (co również ma na celu rozwiązanie problemu). Zgłaszaj się dla ciebie. –

+6

@TheSmose Jak widzę, pytanie brzmiało "Dlaczego to nie działa ...", a nie to, co byłoby alternatywą. Próbowałem więc wyjaśnić na przykładzie, dlaczego nie działa. –

+1

W drugiej odpowiedzi podano dokładne "dlaczego", które napisałeś powyżej, ** i ** "jak to naprawić". Twoja odpowiedź ** ** w minimalnym stopniu, bez próby rozwiązania ** problemu ** jest dla mnie sprzeczna z SO. Poza tym na to pytanie już udzielono odpowiedzi i problem został rozwiązany ... –

9

Łatwe i lepiej niż str_replace:

<?php 
$arr = array(
    "http://" => "http://www.", 
    "w" => "W", 
    "d" => "D"); 

    $word = "http://desiweb.ir"; 
    echo strtr($word,$arr); 
?> 

strtr PHP dochere

+0

Dla tych, którzy się zastanawiają, polecenie stristr powinno być używane w scenariuszach wymagających aplikacji niewrażliwych na wielkość liter. – Tarquin

1

Alternatywnie do odpowiedzi oznaczone jako poprawne, jeśli trzeba zastąpić słowa zamiast znaków można zrobić to z tym kawałkiem kodu:

$query = "INSERT INTO my_table VALUES (?, ?, ?, ?);"; 
$values = Array("apple", "oranges", "mangos", "papayas"); 
foreach (array_fill(0, count($values), '?') as $key => $wildcard) { 
    $query = substr_replace($query, '"'.$values[$key].'"', strpos($query, $wildcard), strlen($wildcard)); 
} 
echo $query; 

Demo tutaj: http://sandbox.onlinephpfunctions.com/code/56de88aef7eece3d199d57a863974b84a7224fd7