难以理解为什么我不能拥有只有唯一对象的对象数组

Trouble to understand why I can't have an array of objects with only unique object

我在一个循环中构建了一个数组,所以我的数组中的每个对象都使用相同的键和相同的数据类型以相同的方式构建。我的阵列看起来像这样:

$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. 
);

所以我有一个包含多个相同对象的数组,我想在我的大数组中包含唯一对象。

我找到了这个解决方案:

How do I use array_unique on an array of arrays?

所以它是完美的,即使它与数组的数组我认为它可以工作。我用我找到的两个最好的答案来测试它:

$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
);

如你所见,他跳过了 key = 2 或 3(两者相同)的对象,从 0 到 4... 我用更多重复项构建了我的 "array_of_obj" 进行了更多测试(我有相同的结构,但有 5 x 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 数组中序列化了所有唯一数据。

我不明白为什么它适用于所有其他对象,但相同的数据只是被跳过或被认为与其他对象相同,即使它不是真的......如果有人有一些线索或一个合乎逻辑的解释就好了,谢谢!

如果您的数组对象未按 id_slot_pbdate 键。如果您粘贴我在 PHP fiddle 上尝试过的代码测试,它会完美运行:

<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 一切正常(我清除了缓存以进行测试)。

所以我想我有我的答案:它工作正常,我没问题!

但现在另一个问题:为什么自从 Moizilla 更新了他们的浏览器后我遇到了麻烦?

我现在会使用 Chrome 但是这个错误很烦人。