Поиск и замена внутри ассоциативного массива

Мне нужно искать и заменять внутри ассоциативного массива.

например:

$user = "user1"; // I've updated this $myarray = array("user1" => "search1", "user2" => "search2", "user3" => "search1" ) ; 

Я хочу заменить search1 на search4 . Как я могу это достичь?

UPDATE: Я забыл упомянуть, что массив имеет несколько значений search1 и я просто хочу изменить значение, где key is == $user . Извините, что не упоминал об этом раньше.

 $myarray = array("user1" => "search1", "user2" => "search2" ); foreach($myarray as $key => $val) { if ($val == 'search1') $myarray[$key] = 'search4'; } 

Для этого есть функция: array_map () .

 // Using a lamba function, PHP 5.3 required $newarray = array_map( function($v) { if ($v == 'search1') $v = 'search4'; return $v; }, $myarray ); 

Если вы не хотите использовать лямбда-функцию, определите нормальную функцию или метод и ответьте на нее.

 $user = "user1"; $myarray = array("user1" => "search1", "user2" => "search2", "user3" => "search1" ); foreach($myarray as $key => $val) { if ($val == 'search1' and $key == $user ) { $myarray[$key] = 'search4'; break; } } print_r($myarray); 

Печать:

 Array ( [user1] => search4 [user2] => search2 [user3] => search1 ) 

Почему бы просто не сделать

 if (isset($myarray[$user])) $myarray[$user] = 'search4'; 
 $originalArray = array( "user1" => "search1" , "user2" => "search2" ); $pattern = 'search1'; $replace = 'search4'; $replacedArray = preg_replace( '/'.$pattern.'/' , $replace , $originalArray ); 

Устраняет риск, упомянутый в комментарии в ответ на это решение

обновленный

Поскольку почта была обновлена, и у меня была возможность немного поспать, я понял, что мой ответ был глупым. Если у вас есть данный ключ, и вам нужно изменить его значение, зачем он перебирать весь массив?

 $user = 'user1'; $search = 'search1'; $replace = 'search4'; $array = array('user1' => 'search1', 'user2' => 'search2'); if (isset($array[$user]) && $search === $array[$user]) $array[$user] = $replace; 

Подобно методу Джозефа (почти то же самое), но с несколькими настройками:

 $user = 'user1'; $array = array("user1" => "search1", "user2" => "search2" ); foreach($array as $key => &$value) { if ($key === $user) { $value = 'search4'; break; // Stop iterating after key has been found } } 

Передача по ссылке – это лучший способ редактировать внутри foreach , и, возможно, быстрее.

Поиск и замена внутри ассоциативного массива или числового значения Заменить значение в любом ассоциативном массиве и массиве может быть любым глубоким

 function array_value_replace($maybe_array, $replace_from, $replace_to) { if (!empty($maybe_array)) { if (is_array($maybe_array)) { foreach ($maybe_array as $key => $value) { $maybe_array[$key] = array_value_replace($value, $replace_from, $replace_to); } } else { if(is_string($maybe_array)){ $maybe_array = str_replace($replace_from, $replace_to, $maybe_array); } } } return $maybe_array; } 

если вы хотите получить конкретный ключ, тогда вы просто добавляете условие для ключа в предыдущие ans like.

 $user = "user1"; $myarray = array("user1" => "search1", "user2" => "search2" ); foreach($myarray as $key => $val) { if ($val == 'search1' && $key == $user) $myarray[$key] = 'search4'; } 

Использование str_replace должно работать:

 $myarray = array("user1" => "search1", "user2" => "search2" ) ; $newArray = str_replace('search1', 'search4', $myarray); 

Следуя от ответа Джозефа, использование preg_replace может позволить вам использовать код в других ситуациях:

 function pregReplaceInArray($pattern,$replacement,$array) { foreach ($array as $key => $value) { $array[$key] = preg_replace($pattern,$replacement,$value); } return $array; }