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


How to filter the Unique Objects in this PHP array object

我有一个从服务器端生成的对象数组,我想在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"
  }
]

这里数组0和1,数组2和数组4有相同的值,如何过滤和获得只有一个值的重复在现有的数组或新生成的数组

通过查看您的数据,似乎可以通过比较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

使用array_unique() PHP函数:

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

我有同样的问题。在array_unique中添加SORT_REGULAR之后,它就可以为我工作了。

array_unique($objectArray, SORT_REGULAR)
//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"