Я искал некоторую стандартную PHP-функцию для замены некоторого значения массива другим, но, к удивлению, я его не нашел, поэтому я должен написать свой собственный:
function array_replace_value(&$ar, $value, $replacement) { if (($key = array_search($ar, $value)) !== FALSE) { $ar[$key] = $replacement; } }
Но я все еще удивляюсь – для такой легкой вещи уже должна быть какая-то функция ! Или, может быть, гораздо более легкое решение, чем этот, изобретенный мной?
Обратите внимание, что эта функция будет выполнять только одну замену. Я ищу существующие решения, которые аналогичным образом заменяют одно вхождение, а также те, которые заменяют все вхождения.
Хотя нет никакой функции, эквивалентной образцу кода, вы можете использовать array_keys
(с дополнительным параметром значения поиска), array_fill
и array_replace
для достижения того же:
EDIT от Tomas : код не работал, исправил его:
$ar = array_replace($ar, array_fill_keys( array_keys($ar, $value), $replacement ) );
Вместо функции, которая заменяет только вхождения одного значения в массиве, существует более общий array_map
:
array_map(function ($v) use ($value, $replacement) { return $v == $value ? $replacement : $v; }, $arr);
Чтобы заменить несколько вхождений нескольких значений с помощью массива value => replacement:
array_map(function ($v) use ($replacement) { return isset($replacement[$v]) ? $replacement[$v] : $v; }, $arr);
Чтобы заменить одно вхождение одного значения, вы должны использовать array_search
как и вы. Поскольку реализация настолько коротка, у разработчиков PHP не так много причин для создания стандартной функции для выполнения задачи. Не сказать, что для вас не имеет смысла создавать такую функцию, если вы часто этого требуете.
Попробуйте эту функцию.
public function recursive_array_replace ($find, $replace, $array) { if (!is_array($array)) { return str_replace($find, $replace, $array); } $newArray = []; foreach ($array as $key => $value) { $newArray[$key] = recursive_array_replace($find, $replace, $value); } return $newArray; }
Ура!
Если производительность является проблемой, можно рассмотреть возможность создания нескольких функций в array_map()
. Обратите внимание, что isset()
работает очень быстро, и это решение вообще не вызывает никаких других функций.
$replacements = array( 'search1' => 'replace1', 'search2' => 'replace2', 'search3' => 'replace3' ); foreach ($a as $key => $value) { if (isset($replacements[$value])) { $tokens[$key] = $replacements[$value]; } }
Как насчет array_walk()
с обратным вызовом?
$array = ['*pasta', 'cola', 'pizza']; $search = '*'; $replace = '\*'; array_walk($array, function (&$v) use ($search, $replace){ $v = str_replace($search, $replace, $v); } ); print_r($array);
Основываясь на Deept Raghav
, я создал следующее решение, которое выполняет поиск по регулярному выражению.
$arr = [ 'Array Element 1', 'Array Element 2', 'Replace Me', 'Array Element 4', ]; $arr = array_replace( $arr, array_fill_keys( array_keys( preg_grep('/^Replace/', $arr) ), 'Array Element 3' ) ); echo '<pre>', var_export($arr), '</pre>';
PhpFiddle: http://phpfiddle.org/lite/code/un7u-j1pt
В зависимости от того, является ли это значение, ключ или оба, которые вы хотите найти и заменить, могли бы сделать что-то вроде этого:
$array = json_decode( str_replace( $replace, $with, json_encode( $array ) ), true );
Я не говорю, что это самый эффективный или элегантный, но приятный и простой.
<b>$green_key = array_search('green', $input); // returns the first key whose value is 'green'
$ input [$ green_key] = 'apple'; // заменим 'green' на 'apple'