【问题标题】:Array Unique with Associative Array - Remove Duplicates具有关联数组的数组唯一性 - 删除重复项
【发布时间】:2011-02-02 08:51:01
【问题描述】:

我有一个包含一些重复项的关联数组。例如,我有:

 <? 
 $group_array = array('user_id'=>array(), 'user_first'=>array());

输出如下:

Array
 (
[user_id] => Array
    (
        [0] => 594
        [1] => 597
        [2] => 594
    )

[user_first] => Array
    (
        [0] => John
        [1] => James
        [2] => John
    )
)

我想清理整个数组,以便只有用户 John 会出现一次(基于 user_id)。

我尝试了以下方法:

 <?php 
   $unique = array_unique($group_array);
   print_r($unique);

但它似乎不起作用。还有其他想法如何删除数组中的重复项吗?

任何帮助都会很棒!

【问题讨论】:

    标签: php duplicates associative-array


    【解决方案1】:

    另一种方法是找到唯一的user_ids,重要的是它们的数组键,然后只保留每列的对应值。

    $group_array = array(
        'user_id'    => array(594,    597,     594,    598   ),
        'user_first' => array('John', 'James', 'John', 'John'),
    );
    
    // Find unique user_ids
    $uniques = array_unique($group_array['user_id']);
    
    // Keep only the uniques
    foreach ($group_array as $column => $collection) {
        $group_array[$column] = array_intersect_key($collection, $uniques);
    }
    
    print_r($group_array);
    

    【讨论】:

      【解决方案2】:

      几件事:

      array_unique 函数不会递归到子数组中

      阅读手册:http://php.net/manual/en/function.array-unique.php “当且仅当 (string) $elem1 === (string) $elem2 时,才认为两个元素相等。换句话说:当字符串表示相同时。将使用第一个元素。”

      在你的情况下 $elem1 和 $elem2 都是数组

      【讨论】:

        【解决方案3】:

        一个可能的解决方案是使用array_combine(...)的过滤副作用:

        $array = [
            'user_id' => [
                0 => 594,
                1 => 597,
                2 => 594
            ],
            'user_first' => [
                0 => 'John',
                1 => 'James',
                2 => 'John'
            ]
        ];
        
        $combinedArray = array_combine($array['user_id'], $array['user_first']);
        

        所以我们得到了数组

        Array
        (
            [594] => John
            [597] => James
        )
        

        要恢复原始结构,我们只需提取键和值:

        $array = [
            'user_id' => array_keys($combinedArray),
            'user_first' => array_values($combinedArray),
        ];
        

        结果:

        Array
        (
            [user_id] => Array
                (
                    [0] => 594
                    [1] => 597
                )
        
            [user_first] => Array
                (
                    [0] => John
                    [1] => James
                )
        )
        

        【讨论】:

          【解决方案4】:

          此脚本删除 user_id 上的重复项并保留多个 如果他们的 id 不同,则为名字:

          $group_array = Array(
              'user_id' => Array(
                  594,
                  597,
                  594,
                  598,
              ),
              'user_first' => Array(
                  'John',
                  'James',
                  'John',
                  'John',
              )
          );
          
          $dup = array();
          for ($i=0; $i<count($group_array['user_id']); $i++) {
              if (in_array($group_array['user_id'][$i], $dup)) {
                  unset($group_array['user_id'][$i]);
                  unset($group_array['user_first'][$i]);
              } else {
                  $dup[] = $group_array['user_id'][$i];
              }
          }
          print_r($group_array);
          

          输出:

          Array
          (
              [user_id] => Array
                  (
                      [0] => 594
                      [1] => 597
                      [3] => 598
                  )
          
              [user_first] => Array
                  (
                      [0] => John
                      [1] => James
                      [3] => John
                  )
          
          )
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-12-13
            • 2021-05-01
            • 1970-01-01
            • 2013-11-14
            • 1970-01-01
            • 2010-12-29
            相关资源
            最近更新 更多