【问题标题】:PHP: Function to group array of objects by valuePHP:按值对对象数组进行分组的函数
【发布时间】:2010-12-01 22:24:33
【问题描述】:

我正在处理一个多维数组。如何按值删除重复项?在以下数组中,[0]、[2] 和 [5] 具有相同的 [ID]。是否有一个函数可以根据特定值删除任何重复的数组?在这种情况下,我想删除数组 [2] 和数组 [5],因为它们的 [ID] 与数组 [0] 相同。

感谢您提供的任何信息。

        Array
(
    [0] => stdClass Object
        (
            [d] => 2010-10-18 03:30:04
            [ID] => 9
        )

    [1] => stdClass Object
        (
            [d] => 2010-10-18 03:30:20
            [ID] => 4
        )

    [2] => stdClass Object
        (
            [d] => 2010-11-03 16:46:34
            [ID] => 9
        )

    [3] => stdClass Object
        (
            [d] => 2010-11-02 03:19:14
            [ID] => 1
        )

    [4] => stdClass Object
        (
            [d] => 2010-05-12 04:57:34
            [ID] => 2
        )    

    [5] => stdClass Object
        (
            [d] => 2010-05-10 05:24:15
            [ID] => 9
        )

)

【问题讨论】:

  • 仅供参考,您继续使用“键”一词,但您实际上指的是“值”,而不是“键”。您提到的 [0]、[2] 和 [5] 是键。 [ID] 也是一个键。每个 ID 包含的 9 都是值。
  • 谢谢,我已经修改了问题的语言。

标签: php unique


【解决方案1】:

一种方法:($old_array 是您的数组,$new_array 将包含新数组,已删除欺骗,由该 ID 键入)

$new_array = array();
foreach ($old_array as $item)
  if (!array_key_exists($item->ID, $new_array))
    $new_array[$item->ID] = $item;

(我没有测试过,但应该可以)

【讨论】:

    【解决方案2】:

    您可以使用ouzo goodies

    $result = FluentArray::from($array)->uniqueBy('ID')->toArray();
    

    http://ouzo.readthedocs.org/en/latest/utils/fluent_array.html#uniqueby

    【讨论】:

      【解决方案3】:

      我认为循环并构造一个新数组是最简单的。在循环中,使用array_key_exists()判断新数组中是否已经存在ID,如果不存在则追加一个元素。

      【讨论】:

        【解决方案4】:

        不是多维数组,它是对象数组。你可以循环它(这个例子改变了数组):

        $ids = array();
        
        forach($array as $key=>$obj) {
            if(isset($ids[$obj->ID])) {//did we already encounter an object with this ID?
                unset($array[$key]); // if yes, delete this object
            }
            else {
                $ids[$obj->ID] = 1; // if not, add ID to processed IDs
            }
        }
        

        您还可以创建一个新数组并将对象添加到新数组中。

        【讨论】:

          【解决方案5】:
          foreach ($array as $element) {
              foreach ($array as &$element2) {
                  if ($element2->ID == $element->ID && $element2 != $element) {
                      unset($element2);
                  }
              }
          }
          

          注意第二个 foreach 中的循环引用。

          【讨论】:

            【解决方案6】:

            检查来自Nsplindexed 函数。

            use function \nspl\op\propertyGetter;
            use function \nspl\a\indexed;
            
            $groupedById = indexed($objects, propertyGetter('id'));
            

            【讨论】:

              猜你喜欢
              • 2013-02-19
              • 1970-01-01
              • 1970-01-01
              • 2010-09-29
              • 2021-05-05
              • 2019-01-30
              • 1970-01-01
              • 2020-02-05
              • 2011-11-26
              相关资源
              最近更新 更多