php array_combine仅在密钥匹配时才显示

时间:2011-11-15 13:43:16

标签: php associative-array

我有

$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

3 个答案:

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