Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅当键匹配时才合并php数组_Php_Associative Array - Fatal编程技术网

仅当键匹配时才合并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
,并且会发生冲突。