PHP Масив

Vladislaw

Registered
Здравйете, имам следния код:
PHP:
 $weeklyParams = Params::getWeeklyParams($this->week);
        foreach ($weeklyParams as $series => $numbers) {
            foreach ($numbers as $number => $params) {
                for ($x = 1; $x <= $params[Params::COPIES]; $x += 1) {
                    $this->initialArray[] =  $series . $number . $params[Params::COPIES];
                }
            }
        }

И ми вади следния резултат:

1,46592,120600,124600,515593,530600

1 > тези числа са до 3000, а следващите са по 5 числа в серия.
Искам да излизат по този начин:
"1": [46592,120600,124600,515593,530600]
 
Ай да видим дали някой може да се справи по-зле от мен :D
Код:
<?php
$var = '1,46592,120600,124600,515593,530600';
$var2 = exolode(',', $var);
$var3 = json_encode([
    $var2[0] => [
        $var2[1], $var2[2], $var2[3], $var2[4], $var2[5]
    ]
]);
 
Здравйете, имам следния код:
PHP:
 $weeklyParams = Params::getWeeklyParams($this->week);
        foreach ($weeklyParams as $series => $numbers) {
            foreach ($numbers as $number => $params) {
                for ($x = 1; $x <= $params[Params::COPIES]; $x += 1) {
                    $this->initialArray[] =  $series . $number . $params[Params::COPIES];
                }
            }
        }

И ми вади следния резултат:



1 > тези числа са до 3000, а следващите са по 5 числа в серия.
Искам да излизат по този начин:
Понеже, не си ни дал входен масив, като пример и определено не си ни показал къде вадиш данните от initialArray, то мога само да предположа и да дам този пример. Създавам втора променлива и си пренареждам масива, след което го преобразувам в стринг, чрез json_encode();

PHP:
$newArrayStructure = [];
$weeklyParams = Params::getWeeklyParams($this->week);
foreach ($weeklyParams as $series => $numbers) {
    foreach ($numbers as $number => $params) {
        for ($x = 1; $x <= $params[Params::COPIES]; $x += 1) {
            $this->initialArray[] = $series . $number . $params[Params::COPIES];
            $newArrayStructure[$series][] = $number . $params[Params::COPIES];
        }
    }
}
$arrayAsString = json_encode($newArrayStructure);
 
Понеже, не си ни дал входен масив, като пример и определено не си ни показал къде вадиш данните от initialArray, то мога само да предположа и да дам този пример. Създавам втора променлива и си пренареждам масива, след което го преобразувам в стринг, чрез json_encode();

PHP:
$newArrayStructure = [];
$weeklyParams = Params::getWeeklyParams($this->week);
foreach ($weeklyParams as $series => $numbers) {
    foreach ($numbers as $number => $params) {
        for ($x = 1; $x <= $params[Params::COPIES]; $x += 1) {
            $this->initialArray[] = $series . $number . $params[Params::COPIES];
            $newArrayStructure[$series][] = $number . $params[Params::COPIES];
        }
    }
}
$arrayAsString = json_encode($newArrayStructure);

Здравей, това връща същият резултат.
Ето го целия файл - https://dox.abv.bg/download?id=2d3073bd95 , искам просто да добавя да са по този начин подредени:
"1": [46592,120600,124600,515593,530600]
 
Нормално е да не ти сработва. На практика трябва да се правят доста промени в класът, че да се получи всичко по начина по който искаш. Не е лошо да осъвремениш кода, че ако го мигрираш на по-висока версия от 5.6 и ще ти мърмори, че не са ти сетнати променливите. Целият ти клас трябва да се пренапише, за да работи коректно всичко.
 
Нищо не трябва да се преправя толкоз - един json encode. Друг е въпроса, че кода е говнокод както и да го погледнеш и така е написан, че 1 нещо да трябва да едитнеш, ще трябва да рефакторваш и трите метода - пък натам по други места :D - един господ знае.

В такива класове писани от ученици - каквото и да пипнеш, нещо някъде се чупи - няма return и то на някакви методи, които проверяват данните или ги моделират.

Това или го оставяй така, или изнеси целия клас с данните, който ще подаваш отделно, и randomizer класа да прави това за което е именуван, без да знае какви са данните - вече накрая си ги трансформирай с json encode или в arrays / objects - или някакъв клас дето ти моделира нещата, ама до там едва ли ще стигнем предвид кода.

В public function generateCSV(): void - има тоя cancer - CSV::sendCsv($fh, $this->checksInfo, self::CSV_HEADERS, $this->packsContent); - празен метод, в който се вика статичен клас, който вика 2 негови метода и навярно пак прави 3-4 неща и не връща нищо пак...


Компромисен вариант - вземи на uphero кода, сложи го в някакъв нов метод, дето да приема тея лайна, и да връща данните както си решиш. Така поне няма да рефакторираш нищо, освен да добавиш метода преди да пуснеш данните по адската верика със static void
 
Последно редактирано:
Нищо не трябва да се преправя толкоз - един json encode. Друг е въпроса, че кода е говнокод както и да го погледнеш и така е написан, че 1 нещо да трябва да едитнеш, ще трябва да рефакторваш и трите метода - пък натам по други места :D - един господ знае.

В такива класове писани от ученици - каквото и да пипнеш, нещо някъде се чупи - няма return и то на някакви методи, които проверяват данните или ги моделират.

Това или го оставяй така, или изнеси целия клас с данните, който ще подаваш отделно, и randomizer класа да прави това за което е именуван, без да знае какви са данните - вече накрая си ги трансформирай с json encode или в arrays / objects - или някакъв клас дето ти моделира нещата, ама до там едва ли ще стигнем предвид кода.

В public function generateCSV(): void - има тоя cancer - CSV::sendCsv($fh, $this->checksInfo, self::CSV_HEADERS, $this->packsContent); - празен метод, в който се вика статичен клас, който вика 2 негови метода и навярно пак прави 3-4 неща и не връща нищо пак...


Компромисен вариант - вземи на uphero кода, сложи го в някакъв нов метод, дето да приема тея лайна, и да връща данните както си решиш. Така поне няма да рефакторираш нищо, освен да добавиш метода преди да пуснеш данните по адската верика със static void
За да се свърши качествено промяната, колегата трябва да промени формата на $this->initialArray. Това означава, че трябва да се правят промени в createInitialArrays() и setPacksContent(), като това ще промени логиката на доста места по веригата. Принципно има вариант да си направи трансформър, обаче до колкото виждам от примера на Автора, иска серията да е водещ ключ, което значи, че трансформъра трябва да прави вложени цикли, както е в createInitialArrays(), което на практика обезсмисля създаването му. По-добрият вариант е пренаписване на класа.
 
Бе как ще ползва моя код :D
Ако е важна част от системата задължително пренаписване.
 

Back
Горе