Я строю массив по циклу, поэтому каждый объект в моем массиве создается одинаковым образом с тем же ключом и тем же типом данных. Мой массив выглядит так:
$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.
Я не могу понять, почему он работает для ВСЕХ других объектов, но те же данные просто пропускаются или считаются идентичными другим, даже если это не так …если у кого-то есть подсказка или логическое объяснение, было бы неплохо, спасибо!
Ваш 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";}"}
Посмотри своими глазами.
Итак, я думаю, я знаю, почему у меня была эта проблема (но я до сих пор не знаю, почему).
Консоли «Mozilla» и «Chrome», которые я использовал для проверки своих данных, имеют разные результаты. С Mozilla у меня отсутствуют некоторые данные, когда с Chrome все в порядке (я очистил свой кеш, чтобы сделать тест).
Так что я думаю, что у меня есть anwser: работает нормально, у меня нет проблем!
Но теперь другой вопрос: почему после обновления браузера Moizilla у меня возникли проблемы?
Сейчас я буду использовать Chrome, но эта ошибка очень раздражает.