PHP:如何将一个数组中的键与另一个数组中的值进行比较,并返回匹配项?
Posted
技术标签:
【中文标题】PHP:如何将一个数组中的键与另一个数组中的值进行比较,并返回匹配项?【英文标题】:PHP: How to compare keys in one array with values in another, and return matches? 【发布时间】:2014-08-24 13:35:29 【问题描述】:我有以下两个数组:
$array_one = array('colorZero'=>'black', 'colorOne'=>'red', 'colorTwo'=>'green', 'colorThree'=>'blue', 'colorFour'=>'purple', 'colorFive'=>'golden');
$array_two = array('colorOne', 'colorTwo', 'colorThree');
我想要一个来自 $array_one
的数组,它只包含键是 $array_two 成员的键值对(通过创建一个新数组或从 @987654324 中删除其余元素@)
我该怎么做?
我查看了 array_diff
和 array_intersect
,但它们将值与值进行比较,而不是将一个数组的值与另一个数组的键进行比较。
【问题讨论】:
array_diff() 或 array_intersect() 结合array_keys() 【参考方案1】:从 php 5.1 开始,有 array_intersect_key
(manual)。
只需使用array_flip()
将第二个数组从 key=>value 翻转为 value=>key,然后比较键。
所以要比较 OP 的数组,可以这样做:
$result = array_intersect_key( $array_one , array_flip( $array_two ) );
根本不需要循环数组。
【讨论】:
好的单行解决方案,但我认为这个函数循环相同。【参考方案2】:更新
查看 Michel 的回答:https://***.com/a/30841097/2879722。这是一个更好、更简单的解决方案。
原答案
如果我理解正确:
返回一个新数组:
$array_new = [];
foreach($array_two as $key)
if(array_key_exists($key, $array_one))
$array_new[$key] = $array_one[$key];
从 $array_one 中剥离:
foreach($array_one as $key => $val)
if(array_search($key, $array_two) === false)
unset($array_one[$key]);
【讨论】:
在内存方面什么会更快且成本更低?我认为是第二个? 是的,我会选择第二个。其中较小的数组用于比较,您正在剥离一个已经设置的变量,而不是创建一个新变量。 第二种方法是快速“AND”比较的一个非常好的建议!【参考方案3】:告诉我它是否有效:
for($i=0;$i<count($array_two);$i++)
if($array_two[$i]==key($array_one))
$array_final[$array_two[$i]]=$array_one[$array_two[$i]];
next($array_one);
【讨论】:
$array_final
是正在创建一个新数组吗?但是当我尝试在循环之后执行print_r($array_final);
时,我得到了Notice: Undefined variable: array_final in C:\xampp\htdocs\testsNine.php on line 14
。 :s
抱歉我忘记声明了:$array_final = array();
我确实尝试过声明它。打印一个空白数组。您还将 count($array_two)
与来自 JS 的 $array_two.length
混淆了。这也产生了一个错误。但我理解这个概念。所以谢谢你。以上是关于PHP:如何将一个数组中的键与另一个数组中的值进行比较,并返回匹配项?的主要内容,如果未能解决你的问题,请参考以下文章