Поиск и замена значения в массиве PHP
Я искал некоторую стандартную PHP-функцию для замены некоторого значения массива другим, но на удивление я его не нашел, поэтому я должен написать свой собственный:
function array_replace_value(&$ar, $value, $replacement)
{
if (($key = array_search($ar, $value)) !== FALSE) {
$ar[$key] = $replacement;
}
}
Но я все еще удивляюсь - для такой легкой вещи для нее уже должна быть какая-то функция! Или, может быть, гораздо более легкое решение, чем этот, изобретенный мной?
Обратите внимание, что эта функция выполняет только одну замену. Я ищу существующие решения, которые аналогичным образом заменяют одно вхождение, а также те, которые заменяют все вхождения.
Ответы
Ответ 1
Пока нет одной функции, эквивалентной образцу кода, вы можете использовать array_keys
(с дополнительным параметром значения поиска) array_fill
и array_replace
, чтобы достичь того же
EDIT от Tomas: код не работал, исправил его:
$ar = array_replace($ar,
array_fill_keys(
array_keys($ar, $value),
$replacement
)
);
Ответ 2
Вместо функции, которая заменяет только вхождения одного значения в массиве, существует более общий 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 не так много причин для создания стандартной функции для выполнения задачи. Не сказать, что для вас нет смысла создавать такую функцию, если вы часто ее нуждаетесь.
Ответ 3
Попробуйте эту функцию.
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;
}
Ура!
Ответ 4
Если производительность является проблемой, можно не создавать несколько функций в array_map()
. Заметим, что isset()
работает очень быстро, и это решение вообще не вызывает никаких других функций.
$replacements = array(
'search1' => 'replace1',
'search2' => 'replace2',
'search3' => 'replace3'
);
foreach ($a as $key => $value) {
if (isset($replacements[$value])) {
$tokens[$key] = $replacements[$value];
}
}
Ответ 5
Как насчет 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);
Ответ 6
На основе ответа 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
Ответ 7
В зависимости от того, будет ли это значение, ключ или оба, которые вы хотите найти и заменить, вы можете сделать что-то вроде этого:
$array = json_decode( str_replace( $replace, $with, json_encode( $array ) ), true );
Я не говорю, что это самый эффективный или элегантный, но приятный и простой.
Ответ 8
<b>$green_key = array_search('green', $input); // returns the first key whose value is 'green'
$input [$ green_key] = 'apple';//заменим 'green' на 'apple'