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



i在循环上构建一个数组,因此我的数组中的每个对象都使用相同的密钥和相同的数据类型构建相同的方式。我的数组看起来像这样:

$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?

所以它是完美的,即使是有一系列数组,我认为它可以起作用。我用我发现的两个最好的anwser对其进行测试:

$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 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 Array中序列化了所有唯一的数据。

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

您的 each test 在字符串序列化的数组上不工作如果您的数组的对象未通过 id_slot_pbdate键订购。如果您粘贴了我在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"one_answers" Chrome"控制台都有不同的结果。使用Mozilla,当Chrome一切都可以时,我会缺少一些数据(我清除了缓存以进行测试)。

所以我认为我有我的anwser:它可以正常工作,我没问题!

但是现在还有其他问题:为什么自Moizilla更新他们的浏览器,所以我遇到了麻烦?

我现在将使用Chrome,但此错误非常烦人。

相关内容

  • 没有找到相关文章

最新更新