[PHP] Sortera om array, växla items

Permalänk
Medlem

[PHP] Sortera om array, växla items

Jag har kört fast och uppskattar någon kan slänga ett öga på detta problem, och förhoppningsvis idiotförklara mig och föreslå en smidig lösning.

Jag har en array med nycklar och värden som jag vill dela upp i två lika stora arrayer (eller en array med en rad mindre om ursprungsarrayen har ojämnt antal rader), och sedan slå ihop den igen med vartannat värde från de båda arrayerna. Kortfattat kan vi kalla det: Steg 1: Kupera, Steg 2: Blanda.

Ursprungsarray:
nyckel 1 : värde 1
nyckel 2 : värde 2
nyckel 3 : värde 3
nyckel 4 : värde 4
nyckel 5 : värde 5

Blir

Del 1:
nyckel 1 : värde 1
nyckel 2 : värde 2
nyckel 3 : värde 3

Del 2:
nyckel 4 : värde 4
nyckel 5 : värde 5

Skall bli:
nyckel 1 : värde 1
nyckel 4 : värde 4
nyckel 2 : värde 2
nyckel 5 : värde 5
nyckel 3 : värde 3

Det är viktigt att nyckel-värde-paren upprätthålls i sorteringen.

Den funktionen jag skrivit ser ut enligt nedan, problemet är att den alltid spottar ut en array med jämnt antal rader, och om ursprungsarrayen har ojämnt antal blir sista raden tom. Sedan är den inte särkilt elegant.

function alternatePositions(Array $positions){ $newpositions = array(); $length = sizeof($positions); $firsthalf = array_slice($positions,0,$length/2+$length%2); $secondhalf = array_slice($positions,$length/2+$length%2); $newpositions[] = current($firsthalf); $newpositions[] = current($secondhalf); for($i = 0;$i<max(sizeof($firsthalf),sizeof($secondhalf));$i++){ $a = next($firsthalf); $b = next($secondhalf); if(!empty($a)){ $newpositions[] = $a; } if(!empty($b)){ $newpositions[] = $b; } } return $newpositions; }

Visa signatur

data, representation av värden, text etc. lämpad för överföring, tolkning eller bearbetning av människor eller maskiner.
dator, digital automatisk beräkningsmaskin som styrs av ett i dess minne lagrat program.

Permalänk
Medlem

Med koden du skrivit så får inte jag någon tom rad sist iaf, men nycklarna sparas inte, utan dom ändras till den nya ordningen.

Jag gjorde några små ändringar i din kod så fungerade det för mig iaf:

$arr = array('a' => 'a','b' => 'b','c' => 'c','d' => 'd','e' => 'e'); function alternatePositions(Array $positions){ $newpositions = array(); $length = sizeof($positions); $firsthalf = array_slice($positions,0,$length/2+$length%2); $secondhalf = array_slice($positions,$length/2+$length%2); $newpositions[key($firsthalf)] = current($firsthalf); $newpositions[key($secondhalf)] = current($secondhalf); for($i = 0;$i<max(sizeof($firsthalf),sizeof($secondhalf));$i++){ $a = next($firsthalf); $b = next($secondhalf); if(!empty($a)){ $newpositions[key($firsthalf)] = $a; } if(!empty($b)){ $newpositions[key($secondhalf)] = $b; } } return $newpositions; } print_r(alternatePositions($arr));