Трудно понять, почему я не могу иметь массив объектов только с уникальным объектом

Я строю массив по циклу, поэтому каждый объект в моем массиве создается одинаковым образом с тем же ключом и тем же типом данных. Мой массив выглядит так:

$array_of_obj = array(
0 => {
date: "2017-11-26"hour_array: Array [ "11:00:00", "12:00:00", "13:00:00", … ]
id_pb: "32"id_slot_pb: "704"},
1 => {
date: "2017-11-26"hour_array: Array [ "11:00:00", "12:00:00", "13:00:00", … ]
id_pb: "32"id_slot_pb: "704"},
2 => {
date: "2017-11-27"hour_array: Array [ "11:00:00", "12:00:00", "13:00:00", … ]
id_pb: "32"id_slot_pb: "705"},
3 => {
date: "2017-11-27"hour_array: Array [ "11:00:00", "12:00:00", "13:00:00", … ]
id_pb: "32"id_slot_pb: "705"},
4 => {
date: "2017-11-28"hour_array: Array [ "11:00:00", "12:00:00", "13:00:00", … ]
id_pb: "32"id_slot_pb: "706"},
// etc.
);

Итак, у меня есть массив с несколькими одинаковыми объектами, и я хотел бы иметь уникальный объект в моем большом массиве.

Я нахожу это решение:

Как я могу использовать array_unique для массива массивов?

Так что это было прекрасно, даже если бы это было с массивом массивов, я думаю, что это могло бы работать. Я проверяю это с двумя лучшими ответами, которые я нахожу:

$array_of_obj = array_intersect_key($array_of_obj, array_unique(array_map('serialize', $array_of_obj)));

А ТАКЖЕ

$array_of_obj = array_intersect_key($array_of_obj, array_unique(array_map(function ($el) {
return $el['id_slot_pb'];
}, $array_of_obj)));

И у меня тот же результат для обоих:

$array_of_obj = array(
0: Object { id_slot_pb: "704", id_pb: "32", date: "2017-11-26", … }
4: Object { id_slot_pb: "706", id_pb: "32", date: "2017-11-28", … },
6: Object { id_slot_pb: "707", id_pb: "32", date: "2017-11-29", … },
8: Object { id_slot_pb: "708", id_pb: "32", date: "2017-11-30", … },
//etc
);

Как вы можете видеть, он пропустил объект с ключом = 2 или 3 (оба одинаковы) и перешел от 0 до 4 …
Я сделал больше тестовых сборок для моего «array_of_obj» с большим количеством дубликатов (у меня была та же структура, но с идентичным объектом 5 на 5, и он все еще пропускал те же данные.

Я попытался проверить, где моя ошибка, поэтому я делаю только это:

$array_of_obj = array_map('serialize', $array_of_obj);

Это было нормально, теперь у меня был массив строк с одинаковым результатом (ключи 0 и 1 одинаковые, 2 и 3 одинаковые, 4 и 5 и т. Д.)

Но когда я использовал array_unique, я потерял ключи 2 и 3, как я сказал:

$array_of_obj = array_unique(array_map('serialize', $array_of_obj));

Я сделал небольшой тест, чтобы проверить, считали ли данные идентичными с помощью array_unique, даже если это не так:

$array_of_obj = array_map('serialize', $array_of_obj);

$test = array();
$string_test = "";
foreach($array_of_obj as $array) {
if ($string_test !== $array) {
$string_test = $array;
$test[] = $array;
}
}

Но с этим это сработало, и все мои уникальные данные были сериализованы в массиве $ test.

Я не могу понять, почему он работает для ВСЕХ других объектов, но те же данные просто пропускаются или считаются идентичными другим, даже если это не так …если у кого-то есть подсказка или логическое объяснение, было бы неплохо, спасибо!

0

Решение

Ваш each тестовое задание по массиву строки сериализовал не работа если объекты вашего массива не упорядочены id_slot_pb или же date ключи. Если вы вставите этот тест кода, который я попробовал PHP скрипка это работает отлично:

<pre>
<?php

$array = [
(object)[
'date' => '2017-11-26',
'hour_array' => ['11:00:00', '12:00:00', '13:00:00'],
'id_pb' => '32',
'id_slot_pb' => '704'
],
(object)[
'date' => '2017-11-26',
'hour_array' => ['11:00:00', '12:00:00', '13:00:00'],
'id_pb' => '32',
'id_slot_pb' => '704'
],
(object)[
'date' => '2017-11-27',
'hour_array' => ['11:00:00', '12:00:00', '13:00:00'],
'id_pb' => '32',
'id_slot_pb' => '705'
],
(object)[
'date' => '2017-11-27',
'hour_array' => ['11:00:00', '12:00:00', '13:00:00'],
'id_pb' => '32',
'id_slot_pb' => '705'
],
(object)[
'date' => '2017-11-28',
'hour_array' => ['11:00:00', '12:00:00', '13:00:00'],
'id_pb' => '32',
'id_slot_pb' => '706'
],
(object)[
'date' => '2017-11-28',
'hour_array' => ['11:00:00', '12:00:00', '13:00:00'],
'id_pb' => '32',
'id_slot_pb' => '706'
],
];

$array = array_map('serialize', $array);

$yourTest = $myTest = [];
$stringTest = "";
foreach($array as $key => $serialized) {
if(!in_array($serialized, $myTest)){
$myTest[$key] = $serialized;
}

if ($stringTest !== $serialized) {
$stringTest = $serialized;
$yourTest[] = $serialized;
}
}

//your test
var_dump($yourTest);

//my test
var_dump($myTest);

//array unique
$array = array_unique($array);
var_dump($array);

?>

</pre>

Результаты:

Ваш тест (это не работает, как я сказал, если не заказал)

 array(3) {
[0]=>
string(178) "O:8:"stdClass":4:{s:4:"date";s:10:"2017-11-26";s:10:"hour_array";a:3:{i:0;s:8:"11:00:00";i:1;s:8:"12:00:00";i:2;s:8:"13:00:00";}s:5:"id_pb";s:2:"32";s:10:"id_slot_pb";s:3:"704";}"[1]=>
string(178) "O:8:"stdClass":4:{s:4:"date";s:10:"2017-11-27";s:10:"hour_array";a:3:{i:0;s:8:"11:00:00";i:1;s:8:"12:00:00";i:2;s:8:"13:00:00";}s:5:"id_pb";s:2:"32";s:10:"id_slot_pb";s:3:"705";}"[2]=>
string(178) "O:8:"stdClass":4:{s:4:"date";s:10:"2017-11-28";s:10:"hour_array";a:3:{i:0;s:8:"11:00:00";i:1;s:8:"12:00:00";i:2;s:8:"13:00:00";}s:5:"id_pb";s:2:"32";s:10:"id_slot_pb";s:3:"706";}"}

Мой тест

array(3) {
[0]=>
string(178) "O:8:"stdClass":4:{s:4:"date";s:10:"2017-11-26";s:10:"hour_array";a:3:{i:0;s:8:"11:00:00";i:1;s:8:"12:00:00";i:2;s:8:"13:00:00";}s:5:"id_pb";s:2:"32";s:10:"id_slot_pb";s:3:"704";}"[2]=>
string(178) "O:8:"stdClass":4:{s:4:"date";s:10:"2017-11-27";s:10:"hour_array";a:3:{i:0;s:8:"11:00:00";i:1;s:8:"12:00:00";i:2;s:8:"13:00:00";}s:5:"id_pb";s:2:"32";s:10:"id_slot_pb";s:3:"705";}"[4]=>
string(178) "O:8:"stdClass":4:{s:4:"date";s:10:"2017-11-28";s:10:"hour_array";a:3:{i:0;s:8:"11:00:00";i:1;s:8:"12:00:00";i:2;s:8:"13:00:00";}s:5:"id_pb";s:2:"32";s:10:"id_slot_pb";s:3:"706";}"}

Массив уникальный

array(3) {
[0]=>
string(178) "O:8:"stdClass":4:{s:4:"date";s:10:"2017-11-26";s:10:"hour_array";a:3:{i:0;s:8:"11:00:00";i:1;s:8:"12:00:00";i:2;s:8:"13:00:00";}s:5:"id_pb";s:2:"32";s:10:"id_slot_pb";s:3:"704";}"[2]=>
string(178) "O:8:"stdClass":4:{s:4:"date";s:10:"2017-11-27";s:10:"hour_array";a:3:{i:0;s:8:"11:00:00";i:1;s:8:"12:00:00";i:2;s:8:"13:00:00";}s:5:"id_pb";s:2:"32";s:10:"id_slot_pb";s:3:"705";}"[4]=>
string(178) "O:8:"stdClass":4:{s:4:"date";s:10:"2017-11-28";s:10:"hour_array";a:3:{i:0;s:8:"11:00:00";i:1;s:8:"12:00:00";i:2;s:8:"13:00:00";}s:5:"id_pb";s:2:"32";s:10:"id_slot_pb";s:3:"706";}"}

Посмотри своими глазами.

0

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

Итак, я думаю, я знаю, почему у меня была эта проблема (но я до сих пор не знаю, почему).

Консоли «Mozilla» и «Chrome», которые я использовал для проверки своих данных, имеют разные результаты. С Mozilla у меня отсутствуют некоторые данные, когда с Chrome все в порядке (я очистил свой кеш, чтобы сделать тест).

Так что я думаю, что у меня есть anwser: работает нормально, у меня нет проблем!

Но теперь другой вопрос: почему после обновления браузера Moizilla у меня возникли проблемы?

Сейчас я буду использовать Chrome, но эта ошибка очень раздражает.

0

По вопросам рекламы [email protected]