使用array_map比较2个数组?

时间:2018-08-20 02:47:02

标签: php arrays function foreach

我想避免在我的实际代码中使用嵌套的foreach,所以我在考虑使用数组函数(如果我错了,请纠正我) 认为它将替换我的代码。 foreach。

我想比较两个WHOLE数组(如果它们具有相同的描述),但是问题是array_walk仅比较第一个键/索引,而没有通过第二个索引进行检查。还有其他方法吗?我只是想优化我的代码

  

顺便说一句,这段代码同时返回了 found

<?php $array = array (
    '1' => array(
        'count' => '1',
        'id' => 1,
        'description' => 'Bag',

    ),
    '2' => array(
        'count' => '1',
        'id' => 2,
        'description' => 'Pencil',
    ), );

$bin = array (
    '1' => array(
        'count' => '1',
        'id' => 2,
        'description' => 'Bag',
    ),
    '2' => array(
        'count' => '1',
        'id' => 2,
        'description' => 'Pencil',
    ), );

$b = array_map(function($array, $bin) {
    if ($array['description'] == $bin['description']){
        $count = "found";
    }else{
        $count = "not found";
    }

    return array("status" => $count, "cart_array" => $array['description'], "bin"=>$bin['description']); }, $array, $bin);

var_dump($b);


?>
  

但是这个,第一个数组没有找到返回,它应该返回   发现是因为$ bin数组中有一个铅笔 bag 更新了代码

<?php
$array = array (
    '1' => array(
        'count' => '1',
        'id' => 1,
        'description' => 'Bag',

    ),
    '2' => array(
        'count' => '1',
        'id' => 2,
        'description' => 'Pencil',
    ),
);

$bin = array (
    '1' => array(
        'count' => '1',
        'id' => 2,
        'description' => 'Pencil',
    ),
    '2' => array(
        'count' => '1',
        'id' => 2,
        'description' => 'Bag',
    ),
);

$b = array_map(function($array, $bin)
{
    if ($array['description'] == $bin['description']){
        $count = "found";
    }else{
        $count = "not found";
    }

    return array("status" => $count, "cart_array" => $array['description'], "bin"=>$bin['description']);
}, $array, $bin);

var_dump($b);


?>

3 个答案:

答案 0 :(得分:0)

首先使用array_columndescription获取所有$array键。然后,您可以使用$bin个值检查这些值。

$desc = array_column($array, 'description');
$b = array_map(function($array, $bin)
{
    global $desc;
    if (in_array($bin['description'], $desc)){
        $count = "found";
    }else{
        $count = "not found";
    }

    return array("status" => $count, "cart_array" => $array['description'], "bin" => $bin['description']);
}, $array, $bin);

var_dump($b);

答案 1 :(得分:0)

问题中没有任何预期的输出,但是我想您想知道它们之间的区别。
在array_diff的手册中,有一个名为arrayRecursiveDiff的代码,该代码处理多维数组并输出差值。

var_dump(arrayRecursiveDiff($array, $bin));


function arrayRecursiveDiff($aArray1, $aArray2) {
  $aReturn = array();

  foreach ($aArray1 as $mKey => $mValue) {
    if (array_key_exists($mKey, $aArray2)) {
      if (is_array($mValue)) {
        $aRecursiveDiff = arrayRecursiveDiff($mValue, $aArray2[$mKey]);
        if (count($aRecursiveDiff)) { $aReturn[$mKey] = $aRecursiveDiff; }
      } else {
        if ($mValue != $aArray2[$mKey]) {
          $aReturn[$mKey] = $mValue;
        }
      }
    } else {
      $aReturn[$mKey] = $mValue;
    }
  }
  return $aReturn;
}

这将输出:

array(2) {
  [1]=>
  array(2) {
    ["id"]=>
    int(1)
    ["description"]=>
    string(3) "Bag"
  }
  [2]=>
  array(1) {
    ["description"]=>
    string(6) "Pencil"
  }
}

答案 2 :(得分:0)

您可以使用此方法。尽管两个数组的长度不同或值的位置不同,这都可以:

$bin_desc=array_column($bin,'description');

$b = array_map(function($array)use($bin_desc) {
    if (in_array($array['description'],$bin_desc)){
        $count = "found";
    }else{
        $count = "not found";
    }

    return array("status" => $count, "cart_array" => $array['description'], "bin"=>$array['description']); }, $array);

var_dump($b);