【问题标题】:PHP - array_map 2 columns and remove duplicate rows by keyPHP - array_map 2列并按键删除重复行
【发布时间】:2019-08-13 14:45:09
【问题描述】:

我有以下从外部 API 动态生成的数组:

$purchases = array(
    array('product_id' => 7, 'receipt' => R13D13),
    array('product_id' => 5, 'receipt' => Y28Z14),
    array('product_id' => 7, 'receipt' => R02310),
    array('product_id' => 5, 'receipt' => E11403)
);

期望的输出:

$purchases_new = array(
    array('product_id' => 7, 'receipt' => R13D13),
    array('product_id' => 5, 'receipt' => Y28Z14)
);

由于 API 的性质,我只能使用 array_map 提取数据:

$purchases_unique = array_unique(
    array_map(function($pid){ return $pid['product_id']; }, $purchases)
);
print_r($purchases_unique);

输出

array((array[251] => 7) array([252] => 5))

输出完全不是我想要的:(如何array_map 2列product_id'receipt并根据product_id删除重复行?

我想实现以下目标:

  1. array_map 两列? (product_idreceipt
  2. 删除 product_id 基于 product_id 键的重复行?

【问题讨论】:

  • 2) 在你的情况下,为什么这些例子会赢?
  • @Goikiu 抱歉我不明白你的问题?如果您指的是我给出的 array_map 代码示例,它就是一个示例。可能有一个更好的解决方案,这就是我在这里发布的原因:)
  • 我不明白您删除重复数据的规则。为什么你选择product_id 7 (R13D13) 的第一个出现和product_id 5 (E11403) 的第二个出现?
  • @Caconde 所以基本上每一行都是一个产品采购订单。正如您将看到的 'product_id' 5 和 'product_id' 7 各有两次出现。我只想为每个产品显示一次,否则最终用户将看到相同的产品两次。不管是第一次还是最后一次出现,它只需要具有独特的产品并显示“收据”值即可。希望这是有道理的。
  • 我已经更改了所需的输出,因为之前的输出让人们感到困惑。

标签: php arrays multidimensional-array array-map


【解决方案1】:

如果您想第一次出现,请使用@TheFirstBird 答案。如果您想要最后一次出现,您可以使用array_columnarray_values 进行更简单的购买:

$newArr = array_values(array_column($purchases, null, "product_id")); 

注意array_column 的第二个参数为空,意思是取整个元素。

现场示例:3v4l

参考:array-columnarray-values

【讨论】:

    【解决方案2】:

    我认为这将满足您的需求: 只需将唯一的 product_ids(带有收据)添加到新数组中:

    $purchases_new = array_reduce($purchases, function($acc, $p) {
        if(!in_array($p['product_id'], array_column($acc, 'product_id'))) {
            $acc[] = $p;
        }
        return $acc;
    }, []);
    

    输出:

    array (
      0 => 
      array (
        'product_id' => 7,
        'receipt' => 'R13D13',
      ),
      1 => 
      array (
        'product_id' => 5,
        'receipt' => 'Y28Z14',
      ),
    )
    

    Try it online!

    【讨论】:

      【解决方案3】:

      根据评论It does not matter if it's the first or last occurrence,您可以使用foreach 并为非重复项创建一个$result 数组。

      对于每次迭代,使用product_id 作为数组键并检查它是否已经被设置。

      如果不是,则添加它。

      $purchases = array(
          array('product_id' => 7, 'receipt' => "R13D13"),
          array('product_id' => 5, 'receipt' => "Y28Z14"),
          array('product_id' => 7, 'receipt' => "R02310"),
          array('product_id' => 5, 'receipt' => "E11403")
      );
      
      $result = [];
      foreach($purchases as $key => $purchase) {
          if (!isset($result[$purchase["product_id"]])) {
              $result[$purchase["product_id"]] = $purchase;
          }
      }
      
      print_r($result);
      

      结果

      Array
      (
          [7] => Array
              (
                  [product_id] => 7
                  [receipt] => R13D13
              )
      
          [5] => Array
              (
                  [product_id] => 5
                  [receipt] => Y28Z14
              )
      
      )
      

      Php demo

      【讨论】:

        猜你喜欢
        • 2012-12-29
        • 2018-11-27
        • 2021-06-24
        • 2010-12-19
        • 2019-07-07
        • 2017-10-19
        • 2012-05-05
        • 1970-01-01
        • 2018-09-06
        相关资源
        最近更新 更多