【问题标题】:Trouble to understand why I can't have an array of objects with only unique object无法理解为什么我不能拥有只有唯一对象的对象数组
【发布时间】:2018-05-08 14:33:29
【问题描述】:

我在循环上构建了一个数组,因此我的数组中的每个对象都以相同的方式构建,具有相同的键和相同的数据类型。我的数组看起来像这样:

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

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

【问题讨论】:

  • 你能发布你的对象数组而不是格式错误的数组吗?我只是在 phpfiddle 中尝试并在这两种情况下都能完美运行
  • 代码位于我在 Ajax 函数中调用的 PHP 脚本中,因此我使用“console.log(response)”检查数据。 “格式错误的数组”(我认为的结果是那个?)是我的控制台的复制/粘贴,他与我发布的第一个相同,没有重复和“id_slot_pb:705”的数据,正如我所说。如果它对你有用,它会是一个可视化问题吗?
  • 刚刚编辑了答案

标签: php arrays unique-array


【解决方案1】:

如果您的数组对象未按id_slot_pbdate 键排序,则您的each 测试 对序列化的字符串数组不起作用。如果您粘贴我在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";}"
}

用眼睛看。

【讨论】:

    【解决方案2】:

    好的,我想我知道为什么会出现这个问题(但我仍然不知道为什么)。

    我用来检查数据的“Mozilla”和“Chrome”控制台都有不同的结果。使用 Mozilla 时,我丢失了一些数据,而 Chrome 一切正常(我清除了缓存以进行测试)。

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-02-12
      • 2017-04-06
      • 1970-01-01
      • 2018-08-10
      • 2013-02-28
      • 1970-01-01
      • 2020-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多