Hier ist die Sache, ich habe ein Array, das ich nach jedem 3. Element neu anordnen möchte. Also 1., 4., 7. und dann 2., 5., 8. und 3., 6., 9. Platz.
davon:
$items = array('1','2','3','4','5','6','7','8','9');
dazu:
$reordered_items = array('1','4','7','2','5','8','3','6','9');
Oder es können auch 3 separate Arrays sein. So was:
['1', '4', '7']
['2', '5', '8']
['3', '6', '9']
Versucht array_chunk($items, count($items) / 3)
, aber es gibt nur dasselbe Array zurück, das in 3 gleiche Arrays unterteilt ist.
['1', '2', '3']
['4', '5', '6']
['7', '8', '9']
Ich weiß nicht, ob ich array_chunk
und dann etwas anderes verwenden soll, um das zu erreichen, was ich will. Also lassen Sie mich wissen, was Sie darüber denken.
UPD: Es müssen nicht genau 9 Elemente im Eingabearray sein. es kann kürzer oder länger sein, der entscheidende Punkt ist, dass es jeden 3. Gegenstand nehmen muss, solange er einen findet, und so weiter...
Also, wenn es 10 Artikel sind:
$items = array('1','2','3','4','5','6','7','8','9','10');
die Ausgabe sollte so aussehen:
$reordered_items = array('1','4','7','10','2','5','8','3','6','9');
Vielen Dank!
Lösung des Problems
Der einfachste Weg, den ich mir vorstellen kann, besteht darin, die Liste dreimal zu durchlaufen:
- Beginnen Sie bei Element 0, überspringen Sie es um 3, stoppen Sie, wenn das Ende der Liste überschritten ist
- Beginnen Sie bei Element 1, überspringen Sie es um 3, stoppen Sie, wenn das Ende der Liste überschritten ist
- Beginnen Sie bei Element 2, überspringen Sie es um 3, stoppen Sie, wenn das Ende der Liste überschritten ist
Dies kann leicht mit der for-Loop-Syntax im C-Stil erreicht werden:
$maxKey = count($items) - 1;
$rearrangedItems = [];
for ( $key=0; $key<=$maxKey; $key+=3 ) {
$rearrangedItems[] = $items[$key];
}
for ( $key=1; $key<=$maxKey; $key+=3 ) {
$rearrangedItems[] = $items[$key];
}
for ( $key=2; $key<=$maxKey; $key+=3 ) {
$rearrangedItems[] = $items[$key];
}
Wenn Sie auf verschiedene Offsets verallgemeinern müssten, könnten Sie das Ganze in eine äußere Schleife stecken, anstatt es zu kopieren und einzufügen:
$offset = 3;
$maxKey = count($items) - 1;
$rearrangedItems = [];
for ( $start=0; $start<$offset; $start++ ) {
for ( $key=$start; $key<=$maxKey; $key+=$offset ) {
$rearrangedItems[] = $items[$key];
}
}
Keine Kommentare:
Kommentar veröffentlichen