поиск и замена значения в массиве PHP - PullRequest
28 голосов
/ 29 декабря 2011

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

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

Ответы [ 9 ]

27 голосов
/ 29 декабря 2011

Вместо функции, которая заменяет только вхождения одного значения в массиве, есть более общая array_map:

array_map(function ($v) use ($value, $replacement) {
    return $v == $value ? $replacement : $v;
}, $arr);

Чтобы заменить множественные вхождения нескольких значений, используя массив значений => replace:

array_map(function ($v) use ($replacement) {
    return isset($replacement[$v]) ? $replacement[$v] : $v;
}, $arr);

Чтобы заменить одно вхождение одного значения, вы должны использовать array_search, как и вы. Поскольку реализация настолько коротка, у разработчиков PHP нет особых оснований создавать стандартную функцию для выполнения задачи. Не говоря уже о том, что вам не имеет смысла создавать такую ​​функцию, если вам часто это нужно.

25 голосов
/ 29 декабря 2011

Хотя нет ни одной функции, эквивалентной образцу кода, вы можете использовать array_keys (с необязательным параметром поиска), array_fill и array_replace для достижения того же:

РЕДАКТИРОВАТЬ Томасом : код не работал, исправил его:

$ar = array_replace($ar,
    array_fill_keys(
        array_keys($ar, $value),
        $replacement
    )
);
6 голосов
/ 01 сентября 2015

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

$replacements = array(
    'search1' => 'replace1',
    'search2' => 'replace2',
    'search3' => 'replace3'
);
foreach ($a as $key => $value) {
    if (isset($replacements[$value])) {
        $a[$key] = $replacements[$value];
    }
}
6 голосов
/ 29 декабря 2011

Попробуйте эту функцию.

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;
}

Ура! * * 1004

3 голосов
/ 13 сентября 2016

А как насчет 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);
2 голосов
/ 05 сентября 2016

В зависимости от того, какое значение, ключ или оба вы хотите найти и заменить, вы можете сделать что-то вроде этого:

$array = json_decode( str_replace( $replace, $with, json_encode( $array ) ), true );

Я не говорю, что это самый эффективный или элегантный, но красивый и простой.

1 голос
/ 05 марта 2016

Основываясь на ответе 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 '', var_export($arr), '
';

PhpFiddle: http://phpfiddle.org/lite/code/un7u-j1pt

0 голосов
/ 11 марта 2019

$ar[array_search('green', $ar)] = 'value';

0 голосов
/ 29 декабря 2011
 <b>$green_key = array_search('green', $input); // returns the first key whose value is 'green'

$ input [$ green_key] = 'apple';// заменить «зеленый» на «яблочный»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...