Мне нужно искать и заменять внутри ассоциативного массива.
например:
$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; }