【问题标题】:Filter array of associative rows to retain only rows with unique value in specified column过滤关联行数组以仅保留指定列中具有唯一值的行
【发布时间】:2022-02-09 22:09:41
【问题描述】:

我有以下数组:

$array = [  
    ['id' => 1, 'code' => '342'],
    ['id' => 2, 'code' => '765'],
    ['id' => 3, 'code' => '134'],
    ['id' => 1, 'code' => '999'],
];

这里Array[0]['id']Array[3]['id'] 是关于['id'] 的重复项。我想删除其中一个(没关系)。

其实我以为我用这段代码找到了解决方案:

//data
$row = $stmt->fetchALL(PDO::FETCH_ASSOC); 

$ids = array();
for($i = 0;$i < count($row); $i++ )
{
    if (in_array($row[$i]['id'], $ids))
        {
            unset($row[$i]);
            continue;
        }

    $ids[] = $row[$i]['id'];

}

print_r($row);

由于某种原因,它适用于小型数组,但如果我有很多重复的值,它会失败。对我所缺少的有什么建议吗?

【问题讨论】:

    标签: php arrays duplicates filtering


    【解决方案1】:

    使用常规foreach 循环的简单解决方案:

    $rows = [
        ['id' => 1, 'code' => '342'],
        ['id' => 2, 'code' => '765'],
        ['id' => 3, 'code' => '134'],
        ['id' => 1, 'code' => '342']
    ];
    
    $ids = [];
    foreach ($rows as $k => $item) {
        if (in_array($item['id'], $ids)){
             unset($rows[$k]);            
        } else {
             $ids[] = $item['id'];
        }    
    }
    
    print_r($rows);
    

    【讨论】:

      【解决方案2】:

      我认为这可以在不循环的情况下完成。让我举个例子:

      $rows = array (
          array ('id' => 1, 'code' => '342'),
          array ('id' => 2, 'code' => '765'),
          array ('id' => 3, 'code' => '134'),
          array ('id' => 1, 'code' => '342')
      );
      
      $input = array_map("unserialize", array_unique(array_map("serialize", $rows)));
      
      echo '<pre>';
      print_r($input);
      

      输出:

       Array
       (
        [0] => Array
          (
              [id] => 1
              [code] => 342
          )
      
        [1] => Array
          (
              [id] => 2
              [code] => 765
          )
      
        [2] => Array
          (
              [id] => 3
              [code] => 134
          )
      
        )
      

      【讨论】:

      • 感谢您的反馈,实际上我错过了问题中的一些内容,该死,对不起!我需要指出它不是完全重复的(哇,我在睡觉)。在我的示例中,只有 'id' 是重复的或 $row[$i]['id']
      • 在发布此答案后,对问题中的示例数据进行了编辑,以更好地代表项目数据。此答案不再适用于 OP 更改的数据。
      【解决方案3】:

      我想删除其中一个(没关系)。

      好的,使用array_column() 使用id 值分配临时第一级键。因为 PHP 不允许同一级别的两个元素共享同一个键,所以后续的每个重复项都会覆盖之前遇到的行。将该调用包装在 array_values() 中以删除临时键(重新索引数组)。

      代码:(Demo)

      var_export(
          array_values(array_column($rows, null, 'id'))
      );
      

      输出:

      array (
        0 => 
        array (
          'id' => 1,
          'code' => '999',
        ),
        1 => 
        array (
          'id' => 2,
          'code' => '765',
        ),
        2 => 
        array (
          'id' => 3,
          'code' => '134',
        ),
      )
      

      【讨论】:

        猜你喜欢
        • 2018-07-07
        • 2015-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-27
        • 2023-01-16
        • 2016-11-07
        相关资源
        最近更新 更多