我有
$map = array('id' => 'clmId', 'name' => 'clmName' => 'value' => 'clmValue',);
$value = array('id' => 1, 'name' => 'Foo', 'value' => 'Bar',);
我希望得到
$expected = array('clmId' => 1, 'clmName' => 'Foo', 'clmValue' => 'Bar');
当然我做了$expected = 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');
显然,array_combine
不适用于组合关联数组。有什么办法可以做到这一点?
我正在做一个原始的foreach($map as $key => $mapValue) { ...
,但我猜测一个更聪明的map / reduce或者一些很酷的数组函数应该为我做。
如果array()
没有来自FALSE
$value
/ $map
答案 0 :(得分:4)
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;
}
如果键不匹配则返回false,如果匹配则返回数组。
$map = array('id' => 'clmId', 'name' => 'clmName', 'value' => 'clmValue');
$value = array('id' => 1, 'name' => 'Foo', 'value' => 'Bar');
$value2 = array('ids' => 1, 'name' => 'Foo', 'value' => 'Bar');
var_dump( combine_if_same_keys( $map, $value ) );
var_dump( combine_if_same_keys( $map, $value2 ) );
Outputs:
array(3) { ["clmId"]=> int(1) ["clmName"]=> string(3) "Foo" ["clmValue"]=> string(3) "Bar" }
bool(false)
编辑:基准测试
刚刚阅读了另一个答案的一些评论,这些评论表明ksort()
会导致性能下降,所以我在2个阵列上进行了一些基准测试Ran ksort()
(尽管是数字键控阵列)每个10,000,000个键仅耗费0.010757923126221秒
Intel Q8200 @ 2.33ghz(4CPU),3072MB RAM,Windows 7 x64。
编辑(按OP):键数也应该匹配
array_diff_key($a1, $a2)
即使count($a2) > count($a1)
返回空数组,array_combine
也会在生成警告时返回FALSE。
可以通过@array_combine
来抑制它,但我宁愿将计数条件(以及array_key_diff
返回的相应empty()测试)放在一起,然后组合数组。
答案 1 :(得分:2)
我认为没有内置方式
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;
}
当然,您可以先简单地sort your arrays by key,但这并不会丢失关键/值对,并且性能会有所下降:
ksort($map);
ksort($value);
$output = array_combine($map, $value);
没有foreach循环的版本,它检查匹配的密钥,但我不推荐它,因为它不会很好用...
function combine_assoc_slow($map, $value) {
ksort($map);
ksort($value);
if(array_keys($map) != array_keys($value)) return FALSE;
return array_combine($map, $value);
}
答案 2 :(得分:0)
如果订单不同,那么array_combine
不起作用?那么,最简单的解决方案:按键排序两个数组!
$map = array('id' => 'clmId', 'name' => 'clmName' => 'value' => 'clmValue');
$value = array('name' => 'Foo', 'id' => 1, 'value' => 'Bar');
ksort($map);
ksort($value);
// keys are "aligned", ready to combine
$expected = array_combine($map, $value);