PHP вложенный foreach неожиданный результат - PullRequest
0 голосов
/ 09 июня 2018

Я не совсем понимаю, что происходит.скопируйте следующий код и запустите его, вы должны увидеть то, что я вижу.

<code>$stores = array(
        (object)[
            "store_id" => 1,
        ],
        (object)[
            "store_id" => 2,
        ],
        (object)[
            "store_id" => 3,
        ]
    );

    $currentYear = date('Y');
    $monthes = array();
    for($i = 1; $i <= 4; $i++){
        $temp = new stdClass();
        $temp->month = $i;
        $temp->sales = 0;
        array_push($monthes, $temp);
    }
    foreach($stores as $store){
        $store->sales = array(
            "currentYear" => (object)[
                "year" => $currentYear,
                "monthes" => $monthes,
            ],
        );
    }

    foreach($stores as $store){
        foreach($store->sales as $year){
           foreach($year->monthes as $month){
               $month->sales += 1;
           }
        }
    }

    print_r("<pre>"); 
    print_r($stores);
    print_r("
");

результат, который он производит, выглядит следующим образом:

   Array
    (
        [0] => stdClass Object
            (
                [store_id] => 1
                [sales] => Array
                    (
                        [currentYear] => stdClass Object
                            (
                                [year] => 2018
                                [monthes] => Array
                                    (
                                        [0] => stdClass Object
                                            (
                                                [month] => 1
                                                [sales] => 3
                                            )

                                        [1] => stdClass Object
                                            (
                                                [month] => 2
                                                [sales] => 3
                                            )

, но я ожидаю, что продажи будут 1. вместо 3.потому что, похоже, он будет посещать каждый месяц всего 1 раз, а начальное значение продаж равно 0. поэтому 0 + = 1 должно быть просто 1. Похоже, что оно зацикливалось на себе 3 раза.

Я не могу обернутья думаю о том, что я здесь сделал неправильно.

1 Ответ

0 голосов
/ 09 июня 2018

Вы сохраняете один и тот же массив $monthes в каждом из currentYear объектов.Когда массив копируется при его назначении, содержащиеся в нем объекты не являются;все эти массивы содержат ссылки на одни и те же четыре объекта.Таким образом, когда вы увеличиваете продажи в магазине 1 месяц 1, это также увеличивает магазин 2 месяца 1, магазин 3 месяца 1 и магазин 4 месяца 1.

Вам нужно поместить цикл, который создает массив $monthesвнутри петли, которая заполняет каждый из магазинов.

<code><?php
$stores = array(
    (object)[
        "store_id" => 1,
        ],
    (object)[
        "store_id" => 2,
        ],
    (object)[
        "store_id" => 3,
        ]
    );

$currentYear = date('Y');
foreach($stores as $store){
    $monthes = array();
    for($i = 1; $i <= 4; $i++){
        $temp = new stdClass();
        $temp->month = $i;
        $temp->sales = 0;
        array_push($monthes, $temp);
    }
    $store->sales = array(
        "currentYear" => (object)[
            "year" => $currentYear,
            "monthes" => $monthes,
            ],
        );
}

foreach($stores as $store){
    foreach($store->sales as $year){
        foreach($year->monthes as $month){
            $month->sales += 1;
        }
    }
}

echo "<pre>";
print_r($stores);
echo "
";
...