在数组中搜索整个值并替换找到的值

问题描述 投票:0回答:12

我一直在寻找一些标准的 PHP 函数来用其他函数替换数组的某些值,但令人惊讶的是我没有找到任何函数,所以我必须编写自己的函数:

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

但我仍然想知道 - 这么简单的事情一定已经有一些功能了!或者也许比我发明的这个解决方案更容易?

请注意,此功能只会进行一次替换。我正在寻找类似地替换单个事件以及替换所有事件的现有解决方案。

php arrays filter replace
12个回答
42
投票

不是只替换数组中出现的一个值的函数,而是更通用的

array_map
:

array_map(fn ($v) => $v == $value ? $replacement : $v, $arr);

要使用值数组替换多个值的多次出现 => 替换:

array_map(fn ($v) => $replacement[$v] ?? $v, $arr);

要替换单个值,您可以像以前一样使用

array_search()
。由于实现如此之短,PHP 开发人员没有太多理由创建标准函数来执行该任务。如果您发现自己经常需要它,并不是说创建这样的函数对您来说没有意义。


33
投票

虽然没有与示例代码等效的函数,但您可以使用

array_keys
(带有可选的搜索值参数)、
array_fill
array_replace
来实现相同的功能:

Tomas 编辑:代码无法正常工作,已更正:

$ar = array_replace($ar,
    array_fill_keys(
        array_keys($ar, $value),
        $replacement
    )
);

17
投票

如果性能是一个问题,可以考虑不在

array_map()
内创建多个函数。请注意,
isset()
非常快,并且此解决方案根本不调用任何其他函数。

$replacements = array(
    'search1' => 'replace1',
    'search2' => 'replace2',
    'search3' => 'replace3'
);
foreach ($a as $key => $value) {
    if (isset($replacements[$value])) {
        $a[$key] = $replacements[$value];
    }
}

7
投票

试试这个功能。

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

干杯!


6
投票

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


4
投票

根据您想要查找和替换的是值、键还是两者,您可以执行以下操作:

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

我并不是说这是最高效或最优雅的,而是说这是很好且简单的。


4
投票

带回调的

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

1
投票

根据

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


1
投票

PHP 8,一个用另一个字符串值替换一个字符串值的严格版本:

array_map(fn (string $value): string => $value === $find ? $replace : $value, $array);

示例 - 将值

foo
替换为
bar

array_map(fn (string $value): string => $value === 'foo' ? 'bar' : $value, $array);

0
投票
$ar = array(1,2,3,4,5,6,7,8);
$find = array(2,3);
$replace = array(13);

function update_bundle_package($ar,$find,$replace){
foreach ($find as $x => $y) {
    ///TO REMOVE PACKAGE
    if (($key = array_search($y, $ar)) !== false) {
        unset($ar[$key]);
    }
    ///TO REMOVE PACKAGE
}
$ar = array_merge($ar, $replace); 
}

0
投票

如果您打算仅替换平面数组中第一个出现的匹配项,那么问题中的

array_search()
实现是理想的选择,因为它在找到匹配项时会短路。

如果任务是搜索多维数组并在仅限定部分数据集时替换部分或全部子数组或对象,那么请尝试 PHP8.4 的

array_find_key()
array_find_key()
array_search()
类似,但以回调的形式提供了更细粒度的工具,用于确定合格值。 如果
array_find_key()
未找到合格值,则返回
null

否则,如果您的任务必须替换数组中的多个值,则可以考虑以下技术:

您可以通过使用包含字符串锚点开始和结束的模式调用

preg_replace()
^
$
)来进行完整字符串匹配,而无需指定限定值的键。 如果您的搜索词可能包含对正则表达式引擎具有特殊含义的字符,请务必使用
preg_quote()
对其进行转义以避免损坏。虽然并不完全需要正则表达式,但正则表达式提供了一些非常方便的方法来调整搜索词处理。 (演示)

function array_replace_value(&$ar, $value, $replacement)
{
    $ar = preg_replace('#^' . preg_quote($value) . '$#', $replacement, $ar);
}

请注意,您不能通过将

preg_replace()
的第四个参数设置为
1
来享受此脚本的短路方法——这仅限制每个遇到的字符串的替换数量,这在这种情况下是无意义的。


我可能更倾向于将

array_map()
与箭头函数语法一起使用,以便可以在自定义函数范围内访问全局变量。 (演示)

$needle = 'foo';
$newValue = 'bar';

var_export(
    array_map(fn($v) => $v === $needle ? $newValue : $v, $array)
);

-1
投票
 <b>$green_key = array_search('green', $input); // returns the first key whose value is 'green'

$input[$green_key] = '苹果'; // 将“绿色”替换为“苹果”

© www.soinside.com 2019 - 2024. All rights reserved.