GOOGLE ADS

Dienstag, 12. April 2022

Ordnen Sie das PHP-Array neu an, ordnen Sie 1, 2, 3, 4, 5, 6, 7, 8, 9 neu an 1, 4, 7, 2, 5, 8, 3, 6, 9

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_chunkund 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

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...