【问题标题】:How to filter the Unique Objects in this PHP array object [duplicate]如何过滤此 PHP 数组对象中的唯一对象
【发布时间】:2016-12-20 19:21:22
【问题描述】:

我有一个从服务器端生成的对象数组,我想过滤 PHP 中的重复项...

下面是生成的数组

array:5 [▼
  0 => {#204 ▼
    +"category_name": "Fashion"
    +"category_id": "fashion"
  }
  1 => {#205 ▼
    +"category_name": "Fashion"
    +"category_id": "fashion"
  }
  2 => {#209 ▼
    +"category_name": "Shirts"
    +"category_id": "shirts"
  }
  3 => {#210 ▼
    +"category_name": "Health"
    +"category_id": "health"
  }
  4 => {#211 ▼
    +"category_name": "Shirts"
    +"category_id": "shirts"
  }
]

这里Array 0和Array 1,Array 2和Array 4的值相同,如何对现有数组中的重复项或新生成的数组中的重复项进行过滤并仅获取单个值。

【问题讨论】:

    标签: php arrays filter


    【解决方案1】:

    通过查看您的数据,您似乎可以通过比较 ONE 属性的唯一性来过滤对象数组。如果是这种情况,那么在处理非常大的数组时,比较单个属性而不是本质上将每个对象转换为字符串并以这种方式进行比较更有效。

    这是一个函数,它应该返回一个属性唯一的对象:

    function returnUniqueProperty($array,$property) {
      $tempArray = array_unique(array_column($array, $property));
      $moreUniqueArray = array_values(array_intersect_key($array, $tempArray));
      return $moreUniqueArray;
    }
    
    $uniqueObjectsById = returnUniqueProperty($yourArray, 'category_id');
    

    说明:

    1. 我们传入我们的函数、数组和您要与其执行“唯一性”比较的列的属性名称。
    2. 然后我们使用 php 的array_column() 函数返回一个仅包含我们要比较的属性的数组。该数组将具有与我们的原始数组相同的索引值。 php.net
    3. 然后我们使用array_unique() 过滤掉临时数组中的任何重复项。至关重要的是,默认情况下,这将删除重复项,但保留每个唯一属性值的原始索引位置。 php.net
    4. 现在,我们只需要将唯一属性值数组的索引位置与原始数组的索引值匹配,即array_intersect_key()php.net
    5. 最后,我们想要“压缩”我们的数组,所以我们array_values(),它会返回一个新数组,其中包含按数字顺序排列的新索引。 php.net

    【讨论】:

      【解决方案2】:

      使用array_unique()PHP函数:

      http://php.net/manual/en/function.array-unique.php

      【讨论】:

      • 不能使用array_unique:错误:stdClass 类的对象无法转换为字符串
      • 您放入数组的那些对象,确保它们实现了__toString() 方法。
      • 在将对象转换为数组并使用array_unique(,SORT_REGULAR) 后,它正在工作
      • 但我想让该值采用新键而不是继承旧键
      • 循环遍历数组并将每个元素推送到一个新数组中,这样键将从0开始并且是连续的。
      【解决方案3】:

      我也有同样的问题。在 array_unique 中添加 SORT_REGULAR 后,它对我有用。

      array_unique($objectArray, SORT_REGULAR)
      

      【讨论】:

        【解决方案4】:
        //comment start:: Dont change "returnUniqueProperty" function
        function returnUniqueProperty($array,$property) {
          $tempArray = array_unique(array_column($array, $property));
          $moreUniqueArray = array_values(array_intersect_key($array, $tempArray));
          return $moreUniqueArray;
        }
        //comment end::
        
        $uniqueObjectsById = returnUniqueProperty($yourArray, 'category_id');
        // "yourArray" replace with your arrayname
        //"category_id" is property to filter:: in your case "category_id"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-10-23
          • 1970-01-01
          • 2021-04-30
          • 2021-02-26
          • 1970-01-01
          • 2015-05-15
          相关资源
          最近更新 更多