仅当键匹配时才合并php数组
我有 我想得到仅当键匹配时才合并php数组,php,associative-array,Php,Associative Array,我有 我想得到 $map = array('id' => 'clmId', 'name' => 'clmName' => 'value' => 'clmValue',); $value = array('id' => 1, 'name' => 'Foo', 'value' => 'Bar',); 当然,我做了$expected=array\u combine($map,$value),它大部分时间都能正常工作,但(令我惊讶的是)在以下方面失败了 $ex
$map = array('id' => 'clmId', 'name' => 'clmName' => 'value' => 'clmValue',);
$value = array('id' => 1, 'name' => 'Foo', 'value' => 'Bar',);
当然,我做了$expected=array\u combine($map,$value)
,它大部分时间都能正常工作,但(令我惊讶的是)在以下方面失败了
$expected = array('clmId' => 1, 'clmName' => 'Foo', 'clmValue' => 'Bar');
显然,array\u combine
并不用于组合关联数组。可以采取什么措施来实现这一目标?我正在做一个原语
foreach($map as$key=>$mapValue){…
,但我猜应该有一个更智能的map/reduce或一些很酷的数组函数来帮我做。如果
$value
没有来自$map
的相应键,则返回array()
/FALSE
,我认为没有内置方法
$map = array('id' => 'clmId', 'name' => 'clmName' => 'value' => 'clmValue',);
$value = array('name' => 'Foo', 'id' => 1, 'value' => 'Bar',);
$expected = array_combine($map, $value);
//you get
//$expected = array('clmId' => Foo, 'clmName' => 1, 'clmValue' => 'Bar');
当然,您可以简单地首先执行此操作,但这并不能解决缺少的键/值对问题,而且性能会有所下降:
function combine_assoc($map, $values) {
$output = array();
foreach($map as $key => $values) {
if(!array_key_exists($key, $value)) return FALSE;
$output[$value] = $values[$key];
}
return $output;
}
没有foreach循环的版本,它会检查匹配的键,但我不推荐它,因为它不会很好地执行
ksort($map);
ksort($value);
$output = array_combine($map, $value);
我认为这是不可能的
$map = array('id' => 'clmId', 'name' => 'clmName' => 'value' => 'clmValue',);
$value = array('name' => 'Foo', 'id' => 1, 'value' => 'Bar',);
$expected = array_combine($map, $value);
//you get
//$expected = array('clmId' => Foo, 'clmName' => 1, 'clmValue' => 'Bar');
当然,您可以简单地首先执行此操作,但这并不能解决缺少的键/值对问题,而且性能会有所下降:
function combine_assoc($map, $values) {
$output = array();
foreach($map as $key => $values) {
if(!array_key_exists($key, $value)) return FALSE;
$output[$value] = $values[$key];
}
return $output;
}
没有foreach循环的版本,它会检查匹配的键,但我不推荐它,因为它不会很好地执行
ksort($map);
ksort($value);
$output = array_combine($map, $value);
因此,如果顺序不同,array\u combine
不起作用?好吧,最简单的解决方案是:按键对两个数组进行排序
function combine_assoc_slow($map, $value) {
ksort($map);
ksort($value);
if(array_keys($map) != array_keys($value)) return FALSE;
return array_combine($map, $value);
}
因此,如果顺序不同,array\u combine
不起作用?好吧,最简单的解决方案是:按键对两个数组进行排序
function combine_assoc_slow($map, $value) {
ksort($map);
ksort($value);
if(array_keys($map) != array_keys($value)) return FALSE;
return array_combine($map, $value);
}
如果键不匹配,则返回false;如果键匹配,则返回数组
function combine_if_same_keys( $array_one, $array_two ) {
$expected = false;
ksort($array_one);
ksort($array_two);
$diff = array_diff_key($array_one, $array_two);
if( empty($diff) && count($array_one) == count($array_two) ) {
$expected = array_combine( $array_one, $array_two );
}
return $expected;
}
编辑:基准测试
只需阅读另一个答案上的一些评论,其中建议ksort()
将导致性能下降,因此我对两个数组(尽管是数字键控数组)进行了一些基准测试,每个数组有10000000个键,只需0.010757923126221秒
英特尔Q8200@2.33ghz(4CPU),3072MB内存,Windows7x64
编辑(按操作):键的数量也应匹配
array\u diff\u key($a1,$a2)
返回空数组,即使count($a2)>count($a1)
,array\u combine在生成警告时返回FALSE
可以通过@array\u combine
来抑制它,但我更愿意将count条件(以及相应的empty()测试放在array\u key\u diff
return)上,然后组合数组
如果键不匹配,则返回false;如果键匹配,则返回数组
function combine_if_same_keys( $array_one, $array_two ) {
$expected = false;
ksort($array_one);
ksort($array_two);
$diff = array_diff_key($array_one, $array_two);
if( empty($diff) && count($array_one) == count($array_two) ) {
$expected = array_combine( $array_one, $array_two );
}
return $expected;
}
编辑:基准测试
只需阅读另一个答案上的一些评论,其中建议ksort()
将导致性能下降,因此我对两个数组(尽管是数字键控数组)进行了一些基准测试,每个数组有10000000个键,只需0.010757923126221秒
英特尔Q8200@2.33ghz(4CPU),3072MB内存,Windows7x64
编辑(按操作):键的数量也应匹配
array\u diff\u key($a1,$a2)
返回空数组,即使count($a2)>count($a1)
,array\u combine在生成警告时返回FALSE
可以通过@array\u combine
来抑制它,但我更愿意设置count条件(以及array\u key\u diff
return上相应的空()测试)然后合并数组。好极了!我喜欢这样,因为大多数时候,我不得不等待答案,这真的很快而且切中要害。非常感谢。很抱歉报告这一点,ksort非常好用,但如果密钥不匹配,此解决方案不会返回false:(棒极了!我喜欢这样,因为大多数时候,我不得不等着接受答案,这真的很快而且切中要害。非常感谢。很抱歉报告这一点,ksort很好而且很方便,但是如果密钥不匹配,此解决方案不会返回false:(接受并投票表决。有趣的是,我在一小时前得出了相同的答案,但我不得不离开办公室,因此无法将其发布到此处。我现在不担心ksort()
的性能问题。许多人将其归类为微优化。此外,我非常确定我的应用程序不会有超过10个键(最大值为50个)事实上,我并不担心性能受到影响——我只是想在阅读了另一个答案后,我会看到它实际上可能是什么。我已经编辑了答案,将其包括count($a1)==count($a2)
,否则array\u combine返回FALSE(这是正确的,但是)还有一个警告。再次感谢。接受并投票。有趣的是,我在一小时前得出了相同的答案,但我不得不离开办公室,因此无法将其发布到此处。我不会担心ksort()的性能受到影响
现在。许多人将其归类为微优化。此外,我非常确定我的应用程序不会有超过10个键(最大值为50个键)。事实上,我并不担心性能受到影响——我只是想在阅读了另一个答案后,我会看到它实际上可能是什么。我已经编辑了答案,以包括计数($a1)==count($a2)
,否则数组返回FALSE(这是正确的,但是)还有一个警告。再次感谢。您的combine\u assoc
函数看起来不错,只是您对两个变量使用了变量名$value
,并且会发生冲突。您的combine\u assoc
函数看起来不错,只是对两个变量使用了变量名$value
,并且会发生冲突。