如何过滤此 PHP 数组对象中的唯一对象

Cha*_*anX 2 php arrays filter

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

\n\n

下面是生成的数组

\n\n
array:5 [\xe2\x96\xbc\n  0 => {#204 \xe2\x96\xbc\n    +"category_name": "Fashion"\n    +"category_id": "fashion"\n  }\n  1 => {#205 \xe2\x96\xbc\n    +"category_name": "Fashion"\n    +"category_id": "fashion"\n  }\n  2 => {#209 \xe2\x96\xbc\n    +"category_name": "Shirts"\n    +"category_id": "shirts"\n  }\n  3 => {#210 \xe2\x96\xbc\n    +"category_name": "Health"\n    +"category_id": "health"\n  }\n  4 => {#211 \xe2\x96\xbc\n    +"category_name": "Shirts"\n    +"category_id": "shirts"\n  }\n]\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n

Doo*_*omd 8

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

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

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');
Run Code Online (Sandbox Code Playgroud)

解释:

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