在 PHP 数组中搜索和替换值
Posted
技术标签:
【中文标题】在 PHP 数组中搜索和替换值【英文标题】:search and replace value in PHP array 【发布时间】:2012-01-29 22:17:00 【问题描述】:我一直在寻找一些标准的 php 函数来将数组的某些值替换为其他值,但令人惊讶的是我没有找到任何值,所以我必须自己编写:
function array_replace_value(&$ar, $value, $replacement)
if (($key = array_search($ar, $value)) !== FALSE)
$ar[$key] = $replacement;
但我仍然想知道 - 这么简单的东西肯定已经有一些功能了!或者也许比我发明的这个更简单的解决方案?
请注意,此功能只会进行一次替换。我正在寻找类似替换单个事件以及替换所有事件的现有解决方案。
【问题讨论】:
注意数组是按值传递的。您要么需要从函数返回新数组(与array_*
的其余函数的行为相匹配),要么通过引用使 array_replace_value
采用 $ar
。
str_replace() 接受数组,但您不能将其限制为一个替换。
谢谢@outis,我自己在调试过程中意识到了这一点:)
@Tomas:当您注意到该函数仅执行一次替换时,您是在指出缺陷还是在指出所需的行为?
@outis,实际上,两者都是 :) 现在是需要的,但对于其他用途,它可能会成为一个缺陷 :)
【参考方案1】:
不是只替换数组中出现的一个值的函数,而是更通用的array_map
:
array_map(function ($v) use ($value, $replacement)
return $v == $value ? $replacement : $v;
, $arr);
使用值数组替换多次出现的多个值 => 替换:
array_map(function ($v) use ($replacement)
return isset($replacement[$v]) ? $replacement[$v] : $v;
, $arr);
要替换一个值的单个匹配项,您可以使用array_search
。由于实现如此之短,PHP 开发人员没有太多理由创建标准函数来执行任务。并不是说创建这样的函数没有意义,如果你发现自己经常需要它。
【讨论】:
+1。感谢 outis 的好答案,我不知道这种语法,但是使用地图和自定义代码是一个强大的工具 - 可能效率低下?我更喜欢 Raghav 之类的“硬编码”解决方案。 @Tomas:您指的是anonymous functions 和闭包的语法吗?除了附加的“use”说明符之外,这比语法更具语义。至于效率,如果有影响,则可以忽略不计(除非您在每个请求中对可能数千个数组执行替换)。影响性能的一个因素是每次调用array_*
函数都会创建一个额外的数组作为其结果:这里一个,Raghav 的三个。与往常一样,分析是确定性能的最佳方式。
... 请注意,Raghav 没有任何硬编码的东西,因为它们都具有相同的参数化值(数组、要替换的值和替换值)。硬编码很少能带来明显的性能优势,因为变量查找的成本很小。
感谢 outis 的回答......但最后我很幸运地使用了 Raghav 的解决方案,原因有一个:我们的托管服务提供商的服务器仍在运行 PHP 5.2,所以我不得不从其中删除所有匿名函数我的代码...(我是在 PHP 5.3 上开发的,所以有点“背叛”...)
@Tomas:我感受到了你的痛苦。对闭包的支持使 PHP 可以忍受。【参考方案2】:
虽然没有与示例代码等效的功能,但您可以使用array_keys
(带有可选的搜索值参数)、array_fill
和array_replace
来实现相同的目的:
由 Tomas 编辑:代码不起作用,已更正:
$ar = array_replace($ar,
array_fill_keys(
array_keys($ar, $value),
$replacement
)
);
【讨论】:
array_replace()
不是假设您已经知道密钥吗? OP 正在寻找按值搜索和替换。
array_replace
替换为键,而不是值。
@RaghavBhushan:如果你有钥匙,你就不需要array_replace
。
@RaghavBhushan:(关于您的原始文章)<br/>
不是semantic。此外,您在 SO 上不需要它。
@RaghavBhushan:Tomas 的函数已经使用 array_search
来查找要替换的单个项目,并且该答案的第一部分已经涵盖了 array_replace
。【参考方案3】:
如果性能是一个问题,可以考虑不在array_map()
中创建多个函数。注意isset()
非常快,而且这个解决方案根本不调用任何其他函数。
$replacements = array(
'search1' => 'replace1',
'search2' => 'replace2',
'search3' => 'replace3'
);
foreach ($a as $key => $value)
if (isset($replacements[$value]))
$a[$key] = $replacements[$value];
【讨论】:
【参考方案4】:试试这个功能。
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;
干杯!
【讨论】:
【参考方案5】:根据您要查找和替换的值、键或两者,您可以执行以下操作:
$array = json_decode( str_replace( $replace, $with, json_encode( $array ) ), true );
我并不是说这是最高效或最优雅的,而是最好最简单的。
【讨论】:
【参考方案6】:$ar[array_search('green', $ar)] = 'value';
【讨论】:
你能在你的代码中添加一些解释吗?如果array_search
返回 false 怎么办?
我不建议研究人员使用这种不稳定且无法解释的sn-p。【参考方案7】:
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);
【讨论】:
【参考方案8】:根据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
【讨论】:
【参考方案9】: <b>$green_key = array_search('green', $input); // returns the first key whose value is 'green'
$input[$green_key] = '苹果'; // 将 'green' 替换为 'apple'
【讨论】:
这基本上是 Tomas 所拥有的,但这并不能处理数组中不存在值的情况。【参考方案10】:PHP 8,将一个字符串值替换为另一个字符串值的严格版本:
array_map(static fn (string $value): string => $value === $find ? $replace : $value, $array);
示例 - 将值 foo
替换为 bar
:
array_map(static fn (string $value): string => $value === 'foo' ? 'bar' : $value, $array);
【讨论】:
以上是关于在 PHP 数组中搜索和替换值的主要内容,如果未能解决你的问题,请参考以下文章