zwei PHP-Arrays – Sortieren Sie ein Array mit der Wertereihenfolge eines anderen

Lesezeit: 3 Minuten

Benutzer-Avatar
Tisch

Ich habe zwei PHP-Arrays wie folgt:

  1. Array von X-Einträgen, die die ID von WordPress-Beiträgen enthalten (in einer bestimmten Reihenfolge)
  2. Array von WordPress-Beiträgen

Die beiden Arrays sehen in etwa so aus:

Array One (Sortiertes benutzerdefiniertes Array von WordPress-Beitrags-IDs)

Array (  
  [0] => 54
  [1] => 10
  [2] => 4
)

Array Zwei (WordPress Post Array)

Array ( 
    [0] => stdClass Object
        (
            [ID] => 4
            [post_author] => 1
    )
    [1] => stdClass Object
        (
            [ID] => 54
            [post_author] => 1
    )
    [2] => stdClass Object
        (
            [ID] => 10
            [post_author] => 1
    )
)

Ich möchte das Array der WordPress-Posts mit der Reihenfolge der IDs im ersten Array sortieren.

Ich hoffe, das macht Sinn und bedanke mich im Voraus für jede Hilfe.

Tom

edit: Auf dem Server läuft PHP Version 5.2.14

Benutzer-Avatar
eines Tages

Dies sollte recht einfach zu bedienen sein usort, die das Array mithilfe einer benutzerdefinierten Vergleichsfunktion sortiert. Das Ergebnis könnte etwa so aussehen:

usort($posts, function($a, $b) use ($post_ids) {
    return array_search($a->ID, $post_ids) - array_search($b->ID, $post_ids);
});

Beachten Sie, dass diese Lösung, da sie verwendet Anonyme Funktionen und Schließungenerfordert PHP 5.3.


Eine einfache Lösung für dieses Pre-5.3 (das dunkle Zeitalter!) ist, dies mit einer schnellen Schleife und dann zu tun ksort:

$ret = array();
$post_ids = array_flip($post_ids);
foreach ($posts as $post) {
    $ret[$post_ids[$post->ID]] = $post;
}
ksort($ret);

  • Ich habe genau diese Lösung eingegeben, +1. PS: Ich denke, Sie müssen $ post_ids vor und nach dieser Funktion array_flip.

    – Richard Tuin

    9. Januar 2011 um 22:38 Uhr

  • @Richard Tuin Das wäre eine Lösung – die andere ist zu verwenden array_searchda ich gerade dabei war, meinen Beitrag zu korrigieren.

    – einsamer Tag

    9. Januar 2011 um 22:40 Uhr

  • Das sieht nach einer sehr eleganten Lösung aus, aber wenn ich versuche, dies zu implementieren, bin ich verwirrt, was die Funktion tun soll? Wenn ich es direkt von hier kopiere, erhalte ich: Parsing-Fehler: Syntaxfehler, unerwartete T_FUNCTION —- Ich habe das Gefühl, ich sollte eine Funktion erstellen, um den Vergleich durchzuführen? (Entschuldigen Sie auch das Missverständnis … Ich habe zweifellos einen Verzögerungsmoment) … Bearbeiten: Lesen php.net/manual/en/function.usort.php scheint es ein wenig klarer zu machen, aber immer noch stecken!

    – Tisch

    9. Januar 2011 um 22:43 Uhr


  • @Tisch $posts ist Ihr Array von Post-Objekten; $post_ids ist Ihr Array von ID-Werten. Verstehen usort, ist es wahrscheinlich am einfachsten, die Handbuchseite zu lesen, auf die ich in meiner Antwort verlinkt habe. Wenn Sie sich immer noch unsicher sind, könnten Sie vielleicht klarstellen, worüber Sie sich nicht sicher sind? Diese Lösung erfordert, dass Sie über PHP 5.3 verfügen – ich werde meine Antwort bearbeiten, um dies widerzuspiegeln.

    – einsamer Tag

    9. Januar 2011 um 22:46 Uhr


  • Sie könnten array_flip() anstelle von array_search für die Lösung vor 5.3 verwenden, was viel besser zum Sortieren einer großen Liste wäre

    – Ziege

    9. Januar 2011 um 23:03 Uhr

Sie könnten einen verschachtelten Schleifenmechanismus erstellen, um die Reihenfolge und die IDs abzugleichen, und ein neues Post-Array neu erstellen.

$new_post_array = array();

foreach($id_array as $id) {          //loop through custom ordered ids

    foreach($post_array as $post) {  //for every id loop through posts

        if($id == $post->ID){         //and when the custom ordered id matches the post->ID

            new_array[] = $post       //push the post on the new array

        }

    }

}

  • Das Erstellen einer Kopie beider Arrays (das macht foreach) ist hier unnötig.

    – Richard Tuin

    9. Januar 2011 um 22:39 Uhr


  • Vielen Dank für Ihre Antwort. Das funktioniert zwar, wirkt aber etwas träge? Ich habe die Antwort trotzdem akzeptiert, weil sie das tut, wonach ich suche, und mit PHP 5.2 funktioniert

    – Tisch

    9. Januar 2011 um 22:53 Uhr


  • Entschuldigung @jondavidjohn, ich musste auf die schnellere Lösung umsteigen. Danke noch einmal.

    – Tisch

    9. Januar 2011 um 23:13 Uhr

$sortOrderMap = array_flip($postIds);

usort($posts, function($postA, $postB) use ($sortOrderMap) {
    return $sortOrderMap[$postA->ID] - $sortOrderMap[$postB->ID];
});

Sie können einfach b von a statt a von b subtrahieren, um in die andere Richtung zu sortieren

  • Vielen Dank auch für Ihre Antwort … Die obige Lösung ist sehr ähnlich, also werde ich diese nach Möglichkeit weiterverfolgen. Sieht so aus, als würde mich PHP 5.2 aufhalten 🙁

    – Tisch

    9. Januar 2011 um 22:53 Uhr

1383130cookie-checkzwei PHP-Arrays – Sortieren Sie ein Array mit der Wertereihenfolge eines anderen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy