Удалить дубликаты из массива многомерных объектов, извлеченных с помощью запроса WordPress

Я пытаюсь получить POST данные основаны на запросе, но я получаю повторяющиеся результаты. Я попытался сортировать регулярно, но все равно он показывает много дубликатов. Что я должен делать?

Мой код (как показано ниже) печатает повторяющиеся идентификаторы объектов в foreach петля. Вот, object_id = 2423 повторяется. Я хочу сохранить один и удалить другой.

$vbn = $wpdb->get_results($query_cat_filter);
$bbc = array_unique($vbn, SORT_REGULAR);

foreach( $bbc as $cOM){
print_r($bbc);
}

Выход:

Array
(
[0] => stdClass Object
(
[object_id] => 2415
[term_taxonomy_id] => 242
[term_order] => 0
)

[1] => stdClass Object
(
[object_id] => 2423
[term_taxonomy_id] => 242
[term_order] => 0
)

[2] => stdClass Object
(
[object_id] => 2423
[term_taxonomy_id] => 312
[term_order] => 0
)
)

Как я могу удалить эти дубликаты значений?

0

Решение

Для этого может быть встроенная функция, однако, когда я хочу организовать по ключу, я использую такую ​​функцию. Примечание: я не пробовал это на объекте, поэтому вам, возможно, придется сначала преобразовать ваши объекты в массив, используя (array):

<?php
function organize($array = array(), $assockey = false,$forcerows = false)
{
if(!empty($array)) {
$i = 0;
foreach($array as $rows) {
if(is_array($rows)) {
foreach($rows as $key => $value) {
if(!empty($rows[$assockey])) {
$_key   =   $rows[$assockey];
$new[$_key][$i][$key]   =   $value;
}
}
}
$i++;
}
}
if(isset($new)) {
foreach($new as $key => $value) {
if(count($value) == 1) {
$keyName    =   array_keys($value);
$new[$key]  =   ($forcerows == true)? array_values($value):$value[$keyName[0]];
}
else {
$new[$key]  =   array_values($value);
}
}
}

return (isset($new))? $new : $array;
}

// Starting input
$vals  =   array(
'0' => array(
'object_id' => 2415,
'term_taxonomy_id' => 242,
'term_order' => 0,),
'1' => array(
'object_id' => 2423,
'term_taxonomy_id' => 242,
'term_order' => 0,
),
'2' => array(
'object_id' => 2423,
'term_taxonomy_id' => 312,
'term_order' => 0
)
);

// Organize by key
$arr    =   organize($vals,'object_id',true);
print_r($arr);
?>

Дает вам массив примерно так:

Array
(
[2415] => Array
(
[0] => Array
(
[object_id] => 2415
[term_taxonomy_id] => 242
[term_order] => 0
)

)

[2423] => Array
(
[0] => Array
(
[object_id] => 2423
[term_taxonomy_id] => 242
[term_order] => 0
)

[1] => Array
(
[object_id] => 2423
[term_taxonomy_id] => 312
[term_order] => 0
)

)

)

Отсюда вы можете просто использовать ключ [0] каждого массива.

0

Другие решения

Достаточно просто:

foreach($vbn as $object) {
$result[$object->object_id] = $object;
}

И если вы хотите изменить порядок ключей впоследствии:

$result = array_values($result);

Альтернативно, если вы не против получить массивы вместо объектов, используйте ARRAY_A в get_results (PHP> = 5.5.0 необходим для array_column):

$vbn = $wpdb->get_results($query_cat_filter, ARRAY_A);
$vbn = array_column($vbn, null, 'object_id');

//or for only `object_id`
$vbn = array_column($vbn, 'object_id');
0

$vbn = array(
(object)array(
'object_id' => 2135,
'term_taxonomy' => 242,
'term_order' => 0,
),
(object)array(
'object_id' => 3245,
'term_taxonomy' => 312,
'term_order' => 0,
),
(object)array(
'object_id' => 3245,
'term_taxonomy' => 242,
'term_order' => 0,
),
(object)array(
'object_id' => 5623,
'term_taxonomy' => 714,
'term_order' => 0,
)
);

Новые массивы можно сделать ассоциативными, для простоты я выбрал числовые.

DEDUP CODE

foreach($vbn as $key => $obj){
$value = get_object_vars($obj);
$vbn2[$value['object_id']] = array($value['term_taxonomy'],$value['term_order']);
}

ИЛИ ЖЕ

foreach($vbn as $obj) {
$result[$obj->object_id] = array($obj->term_taxonomy,$obj->term_order);
}

NEW FOREACH

foreach($vbn2 as $key => $value){
echo "$key => $value[0], $value[1]\n";
}

РЕЗУЛЬТАТ

2135 => 242, 0
3245 => 242, 0
5623 => 714, 0

var_export($vbn2);

array (
2135 =>
array (
'term_taxonomy' => 242,
'term_order' => 0,
),
3245 =>
array (
'term_taxonomy' => 242,
'term_order' => 0,
),
5623 =>
array (
'term_taxonomy' => 714,
'term_order' => 0,
),

Ассоциативный

Результаты такие же, как указано выше.

 var_export($vbn2);

foreach($vbn as $key => $obj){
$value = get_object_vars($obj);
$vbn2[$value['object_id']] = array('term_taxonomy'=>$value['term_taxonomy'],'term_order'=>$value['term_order']);
}
foreach($vbn2 as $key => $value){
echo "$key => " . $value['term_taxonomy'] . ', ' . $value['term_order'] . "\n";
}

array (
2135 =>
array (
'term_taxonomy' => 242,
'term_order' => 0,
),
3245 =>
array (
'term_taxonomy' => 242,
'term_order' => 0,
),
5623 =>
array (
'term_taxonomy' => 714,
'term_order' => 0,
),
)

Если ты не помнишь об ужасном беспорядке

Это точно так же, но результат ужасен.

foreach($vbn as $obj) {
$vbn2[$obj->object_id] = (object) array($obj->term_taxonomy,$obj->term_order);
}
var_export($vbn2);

Выход:

array (
2135 =>
stdClass::__set_state(array(
'term_taxonomy' => 242,
'term_order' => 0,
)),
3245 =>
stdClass::__set_state(array(
'term_taxonomy' => 242,
'term_order' => 0,
)),
5623 =>
stdClass::__set_state(array(
'term_taxonomy' => 714,
'term_order' => 0,
)),
)

ИЛИ ЖЕ
если ты не против потратить память

foreach($vbn as $object) {
$vbn2[$object->object_id] = $object;
}
var_export($vbn2);

выход:

array (
2135 =>
stdClass::__set_state(array(
'object_id' => 2135,
'term_taxonomy' => 242,
'term_order' => 0,
)),
3245 =>
stdClass::__set_state(array(
'object_id' => 3245,
'term_taxonomy' => 242,
'term_order' => 0,
)),
5623 =>
stdClass::__set_state(array(
'object_id' => 5623,
'term_taxonomy' => 714,
'term_order' => 0,
)),
)
0
По вопросам рекламы [email protected]