WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Loopar med php (https://www.wn.se/forum/showthread.php?t=23848)

Starweb 2007-09-26 13:19

Sitter med ett problem som kanske är rätt enkelt men känner bara att min hjärna är på STREJK och inte verkar inte vilja klura ut svaret... =(
Behöver lite php-hjälp! :)


Jag har en array, med lite olika värden som ser ut såhär:

$aaList = array();
$aaList[0][0] = 88;
$aaList[0][1] = 77;
$aaList[0][2] = 66;

$aaList[1][0] = 99;
$aaList[1][1] = 111;

$aaList[2][0] = 11;
$aaList[2][1] = 10;
$aaList[2][2] = 14;
$aaList[2][3] = 12;



Utskriven med print_r($aaList); ser den alltså ut såhär:

Array
(
[0] => Array
(
[0] => 88
[1] => 77
[2] => 66
)
[1] => Array
(
[0] => 99
[1] => 111
)
[2] => Array
(
[0] => 11
[1] => 10
[2] => 14
[3] => 12
)
)



Steg #1:
Det jag vill göra är att ta det FÖRSTA elementet i den FÖRSTA array
sedan det FÖRSTA elementet i den ANDRA array
sen det FÖRSTA elementet i den TREDJE arrayn.

Steg #2:
Det jag vill göra är att ta det FÖRSTA elementet i den FÖRSTA array
sedan det FÖRSTA elementet i den ANDRA array
sen det ANDRA elementet i den TREDJE arrayn.

Steg #3:
Det jag vill göra är att ta det FÖRSTA elementet i den FÖRSTA array
sedan det FÖRSTA elementet i den ANDRA array
sen det TREDJE elementet i den TREDJE arrayn.

Steg #4:
Det jag vill göra är att ta det FÖRSTA elementet i den FÖRSTA array
sedan det FÖRSTA elementet i den ANDRA array
sen det FJÄRDE elementet i den TREDJE arrayn.

Steg #5:
Det jag vill göra är att ta det FÖRSTA elementet i den FÖRSTA array
sedan det ANDRA elementet i den ANDRA array
sen det FÖRSTA elementet i den TREDJE arrayn.

Steg #6:
Det jag vill göra är att ta det FÖRSTA elementet i den FÖRSTA array
sedan det ANDRA elementet i den ANDRA array
sen det ANDRA elementet i den TREDJE arrayn.

osv osv tills samtliga element är genomgånga, men de ska ha den följden som ovan.



Om man skulle verkligen SKRIVA ut exakt vad jag vill
åstadkomma utan att använda loopar eller "dynamik" så blir det såhär:

?><pre><?
echo $aaList[0][0]."
";
echo $aaList[1][0]."
";
echo $aaList[2][0]."
";
echo $aaList[0][0]."
";
echo $aaList[1][0]."
";
echo $aaList[2][1]."
";
echo $aaList[0][0]."
";
echo $aaList[1][0]."
";
echo $aaList[2][2]."
";
echo $aaList[0][0]."
";
echo $aaList[1][0]."
";
echo $aaList[2][3]."
";
echo $aaList[0][0]."
";
echo $aaList[1][1]."
";
echo $aaList[2][0]."
";
echo $aaList[0][0]."
";
echo $aaList[1][1]."
";
echo $aaList[2][1]."
";
echo $aaList[0][0]."
";
echo $aaList[1][1]."
";
echo $aaList[2][2]."
";
echo $aaList[0][0]."
";
echo $aaList[1][1]."
";
echo $aaList[2][3]."
";
echo $aaList[0][1]."
";
echo $aaList[1][0]."
";
echo $aaList[2][0]."
";
echo $aaList[0][1]."
";
echo $aaList[1][0]."
";
echo $aaList[2][1]."
";
echo $aaList[0][1]."
";
echo $aaList[1][0]."
";
echo $aaList[2][2]."
";
echo $aaList[0][1]."
";
echo $aaList[1][0]."
";
echo $aaList[2][3]."
";
echo $aaList[0][1]."
";
echo $aaList[1][1]."
";
echo $aaList[2][0]."
";
echo $aaList[0][1]."
";
echo $aaList[1][1]."
";
echo $aaList[2][1]."
";
echo $aaList[0][1]."
";
echo $aaList[1][1]."
";
echo $aaList[2][2]."
";
echo $aaList[0][1]."
";
echo $aaList[1][1]."
";
echo $aaList[2][3]."
";
echo $aaList[0][2]."
";
echo $aaList[1][0]."
";
echo $aaList[2][0]."
";
echo $aaList[0][2]."
";
echo $aaList[1][0]."
";
echo $aaList[2][1]."
";
echo $aaList[0][2]."
";
echo $aaList[1][0]."
";
echo $aaList[2][2]."
";
echo $aaList[0][2]."
";
echo $aaList[1][0]."
";
echo $aaList[2][3]."
";
echo $aaList[0][2]."
";
echo $aaList[1][1]."
";
echo $aaList[2][0]."
";
echo $aaList[0][2]."
";
echo $aaList[1][1]."
";
echo $aaList[2][1]."
";
echo $aaList[0][2]."
";
echo $aaList[1][1]."
";
echo $aaList[2][2]."
";
echo $aaList[0][2]."
";
echo $aaList[1][1]."
";
echo $aaList[2][3]."
";
?></pre><?





Svar nedan är gissningar från andra som också verkar ha samma feltänk som jag ;)

Svar #1:
for ($iRow=0;$iRow < count($aaList);$iRow++)
{
for($iColumn=0;$iColumn < count($aaList[$iRow]);$iColumn++)
{
echo $aaList[$iRow][$iColumn]."
";
}
}
}


Svar #2:
$iRow=0;
for($iColumn=0;$iColumn < count($aaList[$iRow]);$iColumn++)
{
while ($iRow < count($aaList))
{
echo $aaList[$iRow][$iColumn]."
";
$iRow++;
}
$iRow=0;
}



=> Svar #2 kommer närmare än svar #1, men fortfarande en bra bit kvar.

Har du "rätt tänk" så hjälp gärna oss lägre stående varelser, för min hjärna verkar inte greppa denna loopen.

jonny 2007-09-26 13:50

Intressant problem. Förklara gärna vad du tänkt göra, för jag rör till det för mig själv när jag försöker loopa så. Jag misstänker att det finns en enklare lösning på ditt problem.

Förklara vad det hela går ut på och varifrån indata kommer.

koala 2007-09-26 13:57

Om du inte har något mönster som indexeringen ska följa så är nog inte en loop rätt väg att gå...

fors 2007-09-26 14:33

Jag skrev ihop en funktion för det lite snabbt. Designen är kanske inte den snyggaste, men såvitt jag förstår så fungerar den i alla fall.

Statiska värden (kopierat från ditt inlägg):
http://aspire.niklasfors.com/test2.php
http://aspire.niklasfors.com/test2.phps

Min funktion:
http://aspire.niklasfors.com/test.php
http://aspire.niklasfors.com/test.phps

Jag fick åtminstone samma resultat på dessa sidor när jag körde diff-kommandot av resultatet nyss.

Kod:

~$ wget http://aspire.niklasfors.com/test.php
~$ wget http://aspire.niklasfors.com/test2.php
~$ diff -s test.php test2.php
Filerna test.php och test2.php är lika

Nåväl, nu måste jag till skolan!

orreborre 2007-09-26 14:43

Fixade ihop en lite snabbt jag med, som jag förstår så ska den "klättra" uppåt en nivå hela tiden när den nått toppen på en understående array.
Mitt sätt kanske inte är det bästa, men fungerar om jag förstått det hela rätt.

Kod:

$aaList = array();
$aaList[0][0] = 88;
$aaList[0][1] = 77;
$aaList[0][2] = 66;

$aaList[1][0] = 99;
$aaList[1][1] = 111;

$aaList[2][0] = 11;
$aaList[2][1] = 10;
$aaList[2][2] = 14;
$aaList[2][3] = 12;


print loop($aaList);

function loop($a, $level = '000')
{
        $str = '';

        for($i = 0; $i < count($a); $i++)
        {
 if(@!$a[$i][$level{$i}])
        return '';
 $str .= $a[$i][$level{$i}]."<br>";
        }
       
        $new_low_level = ($level{2} >= (count($a[count($a)-1])-1) ? 0 : $level{2}+1);
        $new_med_level = ($level{2} >= (count($a[count($a)-1])-1) ? ($level{1} >= (count($a[count($a)-2])-1) ? '0' : $level{1}+1) : $level{1});
        $new_top_level = ($level{2} >= (count($a[count($a)-1])-1) && $level{1} >= (count($a[count($a)-2])-1)) ? $level{0}+1 : $level{0};
       
        $new_level = $new_top_level.$new_med_level.$new_low_level;
        $str .= '<br><br>'.loop($a, $new_level);
       
        return $str;
}


edit: Såg nu att jag inte var först, men våra resultat ser lika ut, så det är nog bara att välja :)

Starweb 2007-09-26 17:04

Citat:

Originally posted by fors@Sep 26 2007, 13:33
Jag skrev ihop en funktion för det lite snabbt. Designen är kanske inte den snyggaste, men såvitt jag förstår så fungerar den i alla fall.

Statiska värden (kopierat från ditt inlägg):
http://aspire.niklasfors.com/test2.php
http://aspire.niklasfors.com/test2.phps

Min funktion:
http://aspire.niklasfors.com/test.php
http://aspire.niklasfors.com/test.phps

Jag fick åtminstone samma resultat på dessa sidor när jag körde diff-kommandot av resultatet nyss.

Kod:

~$ wget http://aspire.niklasfors.com/test.php
~$ wget http://aspire.niklasfors.com/test2.php
~$ diff -s test.php test2.php
Filerna test.php och test2.php är lika

Nåväl, nu måste jag till skolan!

Wow! Är djupt imponerad, den fungerade klockrent och dessutom med flera nivåer, dvs även om man stoppade in 2 eller 4 arrays så visslade den bara ut informationen korrekt.

orreborre din funktion fungerade också bra, och löste uppgiften precis som den skulle, men hade behövts modifieras om den skulle klara fler eller färre arrays.



Jag bugar och tackar för alla utomordentliga förslag! Uppgiften är löst.


Får nog återkomma med fler kluriga problem i framtiden, här verkar gömma sig några skarpa hjärnor :)

fors 2007-09-27 08:55

Citat:

Originally posted by Starweb@Sep 26 2007, 16:04
Wow! Är djupt imponerad, den fungerade klockrent och dessutom med flera nivåer, dvs även om man stoppade in 2 eller 4 arrays så visslade den bara ut informationen korrekt.

orreborre din funktion fungerade också bra, och löste uppgiften precis som den skulle, men hade behövts modifieras om den skulle klara fler eller färre arrays.



Jag bugar och tackar för alla utomordentliga förslag! Uppgiften är löst.


Får nog återkomma med fler kluriga problem i framtiden, här verkar gömma sig några skarpa hjärnor :)

Det är ingen fara. Det är bara roligt att lösa sådana problem. :)


Alla tider är GMT +2. Klockan är nu 01:12.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson