поиск и замена значения в массиве PHP

Я искал некоторую стандартную 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'