Вложено за циклично преминаване през многоизмерен масив на всеки - как да направя условно условие за последната стойност

След разходка с влакче в увеселителен парк съм „толкова“ близо до финализиране на сценарий, върху който работя.

Имам многоизмерен масив, съхранен в $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);
}

person Dan    schedule 08.06.2011    source източник
comment
Ще има ли сегментид някога повече от една актуалност и ще има ли актуалността някога повече от една честота? Ако не, почти със сигурност ще бъде по-лесно да работите със структура на масив като $array = array($lineid=>array($segmentid, $recency, $frequency));.   -  person Aether    schedule 08.06.2011
comment
Не, те са уникални - има връзка 1:1:1 между segmentid, честота и актуалност. Честотата се показва като дете на актуалност само поради начина, по който е съставен масивът. Има недостатъци, но след като работих по него толкова дълго, работи (поне до този момент) и съм изумен, че стигнах дотук.   -  person Dan    schedule 08.06.2011


Отговори (1)


Тъй като казвате, че можете да промените структурата на масива, бих избрал нещо от рода на:

$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);
}
person Aether    schedule 08.06.2011
comment
@Aether - var_dump - това е удобно! Благодаря отново. Нека да видя дали разбирам новия код, който предлагате. По отношение на условното, нещото, което не разбирам, е къде да поставя това условно условие, защото не просто искам да направя нещо за всяка от комбинациите segmentid/recency/frequency, но (за пример - може да бъде произволно число) създайте 2 попълнени $target_pixels масива за всеки уникален $lineid - един, съдържащ segment_ids, където action = 0, и един, където action = 1. Продължете... - person Dan; 08.06.2011
comment
...В примера по-горе са създадени 3 масива, всеки от които съдържа комбинация от 0 и 1, докато имам нужда от 6 масива, където 1 се отпечатват, а с 0 правя нещо друго. Надяваме се, че има смисъл? - person Dan; 08.06.2011
comment
@Dan Ако така или иначе трябва да извършите и двете действия за всеки масив, вероятно бихте могли напълно да изпуснете частта action, след което да използвате същия набор от масиви за първото действие (отпечатване) и второто действие (каквото и да е). Ако те трябва да бъдат отделни (напр. второто действие включва манипулирането им, но искате да оригинални данни за отпечатване по-късно), можете да копирате масивите и да работите само с едно копие. - person Aether; 08.06.2011
comment
@Aether - Но всяко действие (0 и 1) трябва да се извърши само за съответния $segmentid. Вземете например масив 111 - трябва да създадем масив $target_pixels с два обекта с данни target_pixel в него (segmentid 1234 и 1244), след това да направим нещо, след което да създадем друг масив target_pixels, този път само с един обект с данни target_pixel в него. Във всеки lineid трябва да се извърши действие върху 0-те като група и върху 1-ците като група, преди да се премине към следващия lineid. Така че изглежда, че условното ще бъде след първото foreach и преди второто, но не виждам как. - person Dan; 08.06.2011
comment
@Dan - А, мисля, че това ми прави много по-ясно! Просто понякога съм малко бавен. :) Нека опитаме отново: актуализирах отговора си - сега получавате два масива в рамките на масива $target_pixels с индекси 0 и 1 - те съответстват на масивите с действие 0 и действие 1. Можете да вземете масива $target_pixels[0] и да правите каквото и да е с го (действие 0), след това вземете масива $target_pixels[1] и го отпечатайте (действие 1). Това ли търсите? - person Aether; 08.06.2011
comment
@Aether - Ти си по-бърз от мен в бавните си дни, така че не се самоуморявай ;-). Това е идеално и работи точно както трябва и още по-добре го разбирам. Много благодаря! - person Dan; 08.06.2011
comment
@Dan - Радвам се да помогна и винаги е по-добре да имате код, който разбирате! :) - person Aether; 08.06.2011