Web-TorMedlem sedan nov. 200013 890 inlägg <?php
$arrTot = array(
array('2','b'),
array('1','c'),
array('3','a'),
);
sort($arrTot);
show($arrTot);
function show($arrTot){
for($i=0; $i < count($arrTot) ; $i++){
for($ii=0; $ii < count($arrTot[$i]) ; $ii++){
echo $arrTot[$i][$ii] . "<br>";
}
echo "---------------<br>";
}
}
?>
Den här koden sorterar på första "kolumnen" (1,2,3). Hur gör jag för att sortera på den andra kolumnen (a,b,c)?
Så att output alltså blir:
3
a
---------------
2
b
---------------
1
c
---------------
colioneMedlem sedan juni 20014 421 inlägg Den där koden sorterar visst på andra kolumnen. Den sorterar alltså på a b c.
Finns det något skäl till varför då har en array i en array?
Sen har du angivit dina nummer som strängar. Det är inte så jättebra.
Vill du sortera på första kolumnen:
http://se2.php.net/ksort
Kan även vara en idé att sätta SORT_STRING flaggan.
sen skulle jag tipsa om print_r() eller var_dump() för att visa innehållet i arrayer. ;)
Ett annat tips när du jobbar med arrayer om du ska köra en for på dem är att använda:
foreach ($variable as $key => $value) {
}
då får du ut både nycken och värdet samtidigt.
Web-TorMedlem sedan nov. 200013 890 inlägg
colione skrev:
Den där koden sorterar visst på andra kolumnen. Den sorterar alltså på a b c.
Va? För mig ser outputen ut så här:
1
c
---------------
2
b
---------------
3
a
---------------
Den sorterar alltså på första kolumnens värden 1, 2, 3
Om man byter ut array-deklarationen mot:
$arrTot = array(
array('2','c'),
array('1','b'),
array('3','a'),
);
Så bli min output:
1
b
---------------
2
c
---------------
3
a
---------------
Den sorterar alltså på första kolumnens värden 1, 2, 3 medan andra kolumnens värden blir osorterat.
Ser din output ut på något annat sätt?
Koden jag visa här är alltså ett kraftigt förenklat exempel av min riktiga kod. Den riktiga koden är ett par tusen rader och jag tänkte att det blir onödigt för er att sätta er in i den koden. Så ni kan helt strunta i hur arrayerna skrivs ut t.ex. ;)
The_HulkMedlem sedan juni 20031 837 inlägg SPiNMedlem sedan mars 20007 896 inlägg function __compare__values($x, $y) {
return strcmp($x[1], $y[1]);
}
usort($arrayToSort, "__compare__values");
Kanske gör tricket? I funktionen '__compare__values' ser du att du kan ändra vilket index som ska jämföras efter.
Notera dock att första dimensionens index ändras (enl. php.net)! http://www.php.net/usort
$arrayToSort[0][0] = "b";
$arrayToSort[1][0] = "a";
$arrayToSort[2][0] = "c";
usort($arrayToSort, "__compare__values");
==>
$arrayToSort[0][0] = "a";
$arrayToSort[1][0] = "b";
$arrayToSort[2][0] = "c";
Web-TorMedlem sedan nov. 200013 890 inlägg
The_Hulk skrev:
Har du kollat något på funktionen array-multisort
länk: http://se2.php.net/manual/sv/function.array-multisort.php
Jag har kollat men kan inte se hur jag skulle använda det för att lösa mitt problem?
SPiN skrev:
Kanske gör tricket? I funktionen '__compare__values' ser du att du kan ändra vilket index som ska jämföras efter.
Det ser ut att funka! Tror inte att det gör något att index ändras i mitt fall. Jag får laborera vidare med den här funktionen. Tack SPiN!
SPiNMedlem sedan mars 20007 896 inlägg Varsågod. :)
Jag vet dock inte hur den förhåller sig prestandamässigt, om du - som du säger - har ett par tusen poster i arrayerna.
Markera som löst? ;)
Web-TorMedlem sedan nov. 200013 890 inlägg
SPiN skrev:
Jag vet dock inte hur den förhåller sig prestandamässigt, om du - som du säger - har ett par tusen poster i arrayerna.
Jag fyller arrayerna via en CSV-fil som i västa fall innehåller 6000-7000 rader. :l
SPiN skrev:
Markera som löst? ;)
Jag avvaktar lite ifall någon har något annan smart lösning.
SPiNMedlem sedan mars 20007 896 inlägg Nu har jag sökt reda på lite information kring den här typen av sortering, och det visar sig att den är fruktansvärt snabb.
Här är en kille som körde igenom en array på 10 000 poster på under en halv sekund:
http://mgccl.com/2007/06/10/much-better-than-quicksort
Web-TorMedlem sedan nov. 200013 890 inlägg Det ser ut att funka riktigt bra!
Kan hända att jag återkommer eftersom det finns en risk att jag måste in och sortera på andra kolumner i 2:a och 3:e hand. ;)
Web-TorMedlem sedan nov. 200013 890 inlägg Det kom tidigare än jag trodde:
Finns det någon enkelt sätt att sortera på 2:a kolumnen i första hand och 3:e kolumen i andra hand?
$arrTot = array(
array('3','a','aaa'),
array('1','b','aaa'),
array('2','a','bbb'),
);
En array kanske inte ens är det bästa sättet att lagra detta på. Finns det något annat sätt att göra i PHP för att lagra en rad/kolumn-struktur?
spangoMedlem sedan juni 20008 205 inlägg Ändra din jämförelsefunktion:
function __compare__values($x, $y) {
$cmp = strcmp($x[1], $y[1]);
if ($cmp != 0) return $cmp; // olika värden i kol 1, sortera på kol 1
else return strcmp($x[2], $y[2]); // kol 1 lika, sortera på kol 2
}
TroxyMedlem sedan mars 20041 505 inlägg Personligen skulle jag försöka mellanlagra i en SQL-databas, då kan du som bekant sortera mycket enkelt och snabbt.
Web-TorMedlem sedan nov. 200013 890 inlägg
spango skrev:
Ändra din jämförelsefunktion:
Nice! Får bygga vidare på detta för att få till en 3:e och en 4:e sortering också. Sen för vi hoppas att det fortfarande går hyfsat snabbt. ;)
Troxy skrev:
Personligen skulle jag försöka mellanlagra i en SQL-databas, då kan du som bekant sortera mycket enkelt och snabbt.
Jag håller med dig men kundkraven gör att jag inte kan mellanlagra informationen någonstans.
Finns det inte något enklare sätt att lagra en tabellstruktur i PHP än arrayer?
SPiNMedlem sedan mars 20007 896 inlägg spango träffade huvudet på spiken. :)
PHP har tyvärr inga collections-klasser, utan allt bygger på arrayer. Alla stack- och kö-funktioner opererar endast på arrayer (array_push(), array_pop(), osv.)