【问题标题】:How to remove duplicate values from an associative array based on a specific value?如何根据特定值从关联数组中删除重复值?
【发布时间】:2011-04-15 14:28:50
【问题描述】:

我有一个看起来像这样的数组:

array(3) { ["fk_article_id"]=> string(1) "4" ["first_name"]=> string(6) "Ulrike" ["last_name"]=> string(10) "Grasberger" }

array(3) { ["fk_article_id"]=> string(1) "9" ["first_name"]=> string(5) "Frank" ["last_name"]=> string(9) "Neubacher" }

array(3) { ["fk_article_id"]=> string(3) "896" ["first_name"]=> string(2) "D." ["last_name"]=> string(5) "Bauer" }

array(3) { ["fk_article_id"]=> string(3) "896" ["first_name"]=> string(2) "S." ["last_name"]=> string(6) "Anders" }

array(3) { ["fk_article_id"]=> string(3) "896" ["first_name"]=> string(2) "M." ["last_name"]=> string(6) "Tsokos" }

array(3) { ["fk_article_id"]=> string(3) "897" ["first_name"]=> string(8) "Reinhard" ["last_name"]=> string(8) "Scholzen" }

现在我要做的是去掉重复的"fk_article_id""896",这样就只剩下第一个了:

array(3) { ["fk_article_id"]=> string(3) "896" ["first_name"]=> string(2) "D." ["last_name"]=> string(5) "Bauer" }

我现在是 array_unique(),但我还没有找到方法告诉函数只使用 "fk_article_id" ID 中的值。

我该怎么做?

编辑:

这是一个三列数据库表的输出:

$authors_result = pg_query($query_authors) or trigger_error("An error occurred.<br/>" . mysql_error() . "<br />SQL-Statements: {$searchSQL}");

while ($row = pg_fetch_assoc($authors_result)) {
var_dump($row);
}

【问题讨论】:

  • 这看起来像几个数组......你有一个数组数组吗?
  • 你能把它显示为代码,而不是输出
  • 这是一个三列数据库表的输出,我编辑了主帖。
  • 如果这是查询的输出,是否可以在 fkarticle_id 字段上使用 group by 子句?
  • 我自己也想过这个,但由于数据库设计限制,这是不可能的。这是一个相当复杂的查询。

标签: php arrays unique associative


【解决方案1】:

** 获取唯一关联数组 ** 使用这种方法可以轻松得到唯一的关联数组/多维数组。

  array:6 [▼
     0 => array:1 [▼
       2 => "Airtel DTH"
           ]
      1 => array:1 [▼
      2 => "Airtel DTH"
           ]
      2 => array:1 [▼
      2 => "Airtel DTH"
           ]
      3 => array:1 [▼
      3 => "NeuSoft PVT LMT"
      ]
       4 => array:1 [▼
      3  => "NeuSoft PVT LMT"
       ]
      5 => array:1 [▼
       3 => "NeuSoft PVT LMT"
       ]
      ]


     function  assoc_Array_unique($array)
            {
                $result = array_map("unserialize", array_unique(array_map("serialize", $array)));

                foreach ($result as $key => $value)
                {
                    if ( is_array($value) )
                    {
                        $result[$key] = assoc_Array_unique($value);
                    }
                }
                return   $result;
            }
   $arr_Company=   assoc_Array_unique($arr_Company);  // get Unique Array 
                $arr_Company = array_values($arr_Company); Rearrange Index of Array.

【讨论】:

    【解决方案2】:

    使用array_reduce 的快速方法如下所示:

    $unique = array_reduce($subject, function($final, $article){
        static $seen = array();
        if ( ! array_key_exists($article['fk_article_id'], $seen)) {
            $seen[$article['fk_article_id']] = NULL;
            $final[] = $article;
        }
        return $final;
    });
    

    试试a working example


    编辑:似乎您不想使用汇总结果。以下是另外两个想法:

    PHP 中的过滤

    $seen = array();
    while ($row = pg_fetch_assoc($authors_result)) {
        // Skip this row if we have already seen its article id
        if (array_key_exists($row['fk_article_id'], $seen)) {
            continue;
        }
        // Note that we have seen this article
        $seen[$row['fk_article_id']] = NULL;
        // Do whatever with your row
        var_dump($row);
    }
    

    在数据库中过滤

    这里的想法是更改正在执行的查询,以便重复的文章 ID 不会出现在结果集中。如何完成将取决于您已经在使用的查询。

    【讨论】:

    • 看起来不错,谢谢! $subject 可以使用一个数组而不是多维数组吗?
    • 你当然是绝对正确的 :) 但我不知道使用哪个 pg_fetch_* 函数我可以得到完全适合你的 $subject 的输出...... pg_fetch_all 并没有真正起作用。我是初学者,对不起.. :/
    【解决方案3】:

    一种方法是遍历数组,将每个 fk_article_id 的第一个实例单独复制到一个新数组中。

    <?php
    
    $your_unique_array = array();
    foreach ($your_original_array as $v) {
      if (!isset($your_unique_array[$v['fk_article_id']) {
          $your_unique_array[$v['fk_article_id'] = $v;
      }
    }
    

    【讨论】:

      【解决方案4】:

      我会使用 foreach 循环遍历数组并将所有没有重复 _id 的数组保存到一个新数组中。

      $clean = array();
      foreach ($arrays as $array) {
        if (!isset($clean[$array['fk_article_id']])
          $clean[$array['fk_article_id']] = $array;
      }
      

      【讨论】:

        【解决方案5】:
        foreach($array as $key => $value){
            if(!in_array( $array[$key]['fk_article_id'], $usedValues)){
                $usedValues = $array[$key]['fk_article_id'];
                $cleanArray = $array[$key];
            }
        }
        

        应该这样做,我认为没有预先存在的数组功能

        【讨论】:

          猜你喜欢
          • 2013-01-11
          • 2021-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多