用新值重建重复对象PHP数组

用新值重建重复对象PHP数组,php,arrays,sorting,object,Php,Arrays,Sorting,Object,在花了太多时间对我期望的一项直截了当的任务进行故障排除之后,我相信我要么错过了一个明显的缺陷,要么构建了一个错误的思维模型来说明它应该如何工作 我的实际数据要复杂得多,但我已将其简化为以下示例 假设我有一个对象数组$my_array: $object1 = new stdClass(); $object1->valueA = 'abc'; $object1->valueB = 'def'; $object1->valueC = '20160410'; $

在花了太多时间对我期望的一项直截了当的任务进行故障排除之后,我相信我要么错过了一个明显的缺陷,要么构建了一个错误的思维模型来说明它应该如何工作

我的实际数据要复杂得多,但我已将其简化为以下示例

假设我有一个对象数组
$my_array

$object1 = new stdClass();
    $object1->valueA = 'abc';
    $object1->valueB = 'def';
    $object1->valueC = '20160410';
$object2 = new stdClass();
    $object2->valueA = '123';
    $object2->valueB = '456';
    $object2->valueC = '20160408';
$object3 = new stdClass();
    $object3->valueA = 'foo';
    $object3->valueB = 'bar';
    $object3->valueC = '20160412';

$my_array = array(
    'X' => $object1,
    'Y' => $object2,
    'Z' => $object3
);
我想遍历每个对象,使用它的一个值来计算一个新属性,然后将该对象分配给一个新数组,使用新的计算值对它们进行分组

我是这样做的:

$new_array= array();
foreach($my_array as $key=>$obj){
    for($i=0;$i<=2;$i++){  //the real use case uses a slightly different loop, this is simpler/shorter for an example 
        $date = $obj->valueC + $i;  //use valueC and the loop to calculate a new value
        $obj->date = $date;  //add my new value to the object
        $new_array[$date][$key] = $obj;  //construct new array of arrays of objects. bits on bits on bytes.
    }
}
现在,我希望$new_数组['20160410']['X']->日期为
20160410
。毕竟,在2行内,我说过,“将此值用作顶级数组键,也用作对象中的值”。但无论我做什么,所有
['X']
的实例都将具有相同的
日期值。同样适用于
['Y']
['Z']


我的目标是能够在对象中存储新计算的
日期
值,同时也将该值用作分组键。

默认情况下,对象是通过引用分配的,您可以在下面的

PHP 5 OOP中经常提到的一个关键点是,“默认情况下对象是通过引用传递的”

因此,您可以想象您在for循环中的赋值:

$new_array[$date][$key] = $obj;
像这样:

[04-Apr-2016 22:09:28 UTC] Array
(
    [20160410] => Array
        (
            [X] => stdClass Object
                (
                    [valueA] => abc
                    [valueB] => def
                    [valueC] => 20160410
                    [date] => 20160412
                )

            [Y] => stdClass Object
                (
                    [valueA] => 123
                    [valueB] => 456
                    [valueC] => 20160408
                    [date] => 20160410
                )

        )

    [20160411] => Array
        (
            [X] => stdClass Object
                (
                    [valueA] => abc
                    [valueB] => def
                    [valueC] => 20160410
                    [date] => 20160412
                )

        )

    [20160412] => Array
        (
            [X] => stdClass Object
                (
                    [valueA] => abc
                    [valueB] => def
                    [valueC] => 20160410
                    [date] => 20160412
                )

            [Z] => stdClass Object
                (
                    [valueA] => foo
                    [valueB] => bar
                    [valueC] => 20160412
                    [date] => 20160414
                )

        )

    [20160408] => Array
        (
            [Y] => stdClass Object
                (
                    [valueA] => 123
                    [valueB] => 456
                    [valueC] => 20160408
                    [date] => 20160410
                )

        )

    [20160409] => Array
        (
            [Y] => stdClass Object
                (
                    [valueA] => 123
                    [valueB] => 456
                    [valueC] => 20160408
                    [date] => 20160410
                )

        )

    [20160413] => Array
        (
            [Z] => stdClass Object
                (
                    [valueA] => foo
                    [valueB] => bar
                    [valueC] => 20160412
                    [date] => 20160414
                )

        )

    [20160414] => Array
        (
            [Z] => stdClass Object
                (
                    [valueA] => foo
                    [valueB] => bar
                    [valueC] => 20160412
                    [date] => 20160414
                )

        )

)
$new_array[$date][$key] = &$obj; ↑
您一开始就注意到,数组中的每个对象的所有值都是相同的。下一步是检查代码中使用的所有内容的手册。如果数据在关系数据库中,这将是微不足道的。哇-你刚刚澄清了我对对象的长期误解,我可以立即看到它们在许多方面可能是有用的,我以前从未考虑过。我只希望在我花了这么多时间调试之前,我已经在两天前发布了这篇文章!下次,也许我会尝试ole RTFM方法。谢谢@AndrewCaforek如果你调试了很长时间,这不是一件坏事。也许下一次你可以开始阅读手册,了解你在代码中使用的所有东西;) $new_array[$date][$key] = clone $obj;