Вложено для каждого цикла по многомерному массиву - как сделать условие для последнего значения - PullRequest
0 голосов
/ 08 июня 2011

После катания на американских горках "я" близок к завершению сценария, над которым я работал.

У меня есть многомерный массив, хранящийся в $newarray, как показано ниже. Я сам построил этот массив, чтобы при необходимости можно было изменить его код. Но после создания я перебираю его, выбирая нужные значения. Я создаю новый массив для каждого ключа в верхнем массиве (в данном случае 3, 111, 222 и 333) и заполняю каждый набором данных из следующего ключа массива вместе с некоторыми другими данными.

Однако в приведенном ниже примере мне нужно сгенерировать каждый из 3 массивов (111, 222, 333) дважды, один раз, когда конечное значение массива = 0 ($ the_action), и один раз, когда он = '1'. Где это = 1, напечатайте это, иначе, где это = 0, сделайте что-нибудь еще.

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

Благодарен за любую помощь.

Array
(
    [111] => Array
        (
            [1234] => Array
                (
                    [100000] => Array
                        (
                            [20000] => 0
                        )

                )

            [1244] => Array
                (
                    [100001] => Array
                        (
                            [20001] => 1
                        )

                )

            [1255] => Array
                (
                    [100002] => Array
                        (
                            [20002] => 1
                        )

                )

        )

    [222] => Array
        (
            [1233] => Array
                (
                    [100013] => Array
                        (
                            [20013] => 0
                        )

                )

            [1241] => Array
                (
                    [100014] => Array
                        (
                            [20014] => 1
                        )

                )

        )

    [333] => Array
        (
            [15633] => Array
                (
                    [100026] => Array
                        (
                            [20026] => 0
                        )

                )
            [12144] => Array
                (
                    [100028] => Array
                        (
                            [20028] => 0
                        )

                )

        )
)

Код для построения $ newarray ($ stack поступает из CSV с 5 столбцами):

$newarray = array();
foreach($stack as $val){
    $lineid = $val[0]; $segmentid = $val[1]; $action = $val[2]; $recency = $val[3]; $frequency = $val[4];
    $newarray[$lineid][$segmentid][$recency][$frequency] = $action;
}

Код для прохода по массиву:

foreach($newarray as $key => $value) {
    $target_pixels = array();
    $owner_id = $key;
    foreach($value as $key2 => $value2){
        $target_pixel = new stdClass;
        $target_pixel->conversion_id = $key2;
        $target_pixel->negated = false;
        foreach($value2 as $key3 => $value3){
            $target_pixel->seconds_since_conversion = $key3 * 24 * 60 * 60;
            foreach($value3 as $key4 => $value4){
                $target_pixel->frequency_min = $key4;
                $the_action = $value4;
            }
        }
        $target_pixels[] = $target_pixel;
    }
    print_r($target_pixels);
}

1 Ответ

1 голос
/ 08 июня 2011

Так как вы говорите, что можете изменить структуру массива, я бы сказал, что-то вроде:

$newarray = array();
foreach($stack as $val){
    $lineid = $val[0]; 
    $segmentid = $val[1]; 
    $action = $val[2]; 
    $recency = $val[3]; 
    $frequency = $val[4];
    $newarray[$lineid][$segmentid] = array(
        'recency' => $recency,
        'frequency' => $frequency
        'action' => $action
    );
}

Тогда ваш код будет выглядеть так:

foreach ($newarray as $lineid => $line) {
    $target_pixels = array();
    $owner_id = $lineid;
    foreach ($line as $segmentid => $segment){
        $target_pixel = new stdClass;
        $target_pixel->conversion_id = $segmentid;
        $target_pixel->negated = false;
        $target_pixel->seconds_since_conversion = $segment['recency'] * 24 * 60 * 60;
        $target_pixel->frequency_min = $segment['frequency'];

        $target_pixels[$segment['action']][] = $target_pixel;
    }
    var_dump($target_pixels);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...