【问题标题】:Comparing 2 Arrays using array_map?使用 array_map 比较 2 个数组?
【发布时间】:2019-01-26 03:50:00
【问题描述】:

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

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

顺便说一句,这段代码同时返回找到

<?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 数组中有 pencilbag 更新了代码

<?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);


?>

【问题讨论】:

    标签: php arrays function foreach


    【解决方案1】:

    首先使用array_column$array 获取所有description 密钥。然后,您可以使用$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);
    

    【讨论】:

      【解决方案2】:

      您在问题中没有任何预期的输出,但我假设您想知道它们之间的区别。
      在 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"
        }
      }
      

      【讨论】:

        【解决方案3】:

        你可以使用这个。尽管如此,两个数组的长度不同或者值的位置不同,这将起作用:

        $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);
        

        【讨论】:

          猜你喜欢
          • 2023-01-29
          • 2011-12-01
          • 2017-07-01
          • 2022-01-11
          • 2011-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多