Подтвердить что ты не робот

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

Я искал некоторую стандартную PHP-функцию для замены некоторого значения массива другим, но на удивление я его не нашел, поэтому я должен написать свой собственный:

function array_replace_value(&$ar, $value, $replacement)
{
    if (($key = array_search($ar, $value)) !== FALSE) {
        $ar[$key] = $replacement;
    }
}

Но я все еще удивляюсь - для такой легкой вещи для нее уже должна быть какая-то функция! Или, может быть, гораздо более легкое решение, чем этот, изобретенный мной?

Обратите внимание, что эта функция выполняет только одну замену. Я ищу существующие решения, которые аналогичным образом заменяют одно вхождение, а также те, которые заменяют все вхождения.

4b9b3361

Ответ 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'