2011-01-09 8 views
7

Ho due array PHP in questo modo:due array php - ordina un array con l'ordine valore di un'altra

  1. matrice di record X contenenti l'ID di posti Wordpress (in particolare ordine)
  2. Array di tutti i messaggi di Wordpress

I due array sembrare qualcosa di simile:

Array One (Array personalizzato Ordinato di Wordpress ID sul post)

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

Array Two (Wordpress Messaggio 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 
    ) 
) 

Vorrei ordinare l'array di post WordPress con l'ordine degli ID di a il primo array.

Spero che abbia senso, e grazie in anticipo di qualsiasi aiuto.

Tom

edit: Il server esegue PHP versione 5.2.14

risposta

9

Questo dovrebbe essere abbastanza facile utilizzando usort, che ordina l'array usando una funzione definita dall'utente. Il risultato potrebbe essere simile a questo:

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

Si noti che questa soluzione, in quanto utilizza anonymous functions and closures, richiede PHP 5.3. (! secoli bui)


Una semplice soluzione per questo pre-5.3 è quello di fare questo con un ciclo veloce e poi ksort:

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

Stavo scrivendo questa stessa identica soluzione, +1. PS: penso che sia necessario array_flip $ post_ids prima e dopo questa funzione. –

+0

@Richard Tuin Questa sarebbe una soluzione - l'altra è usare 'array_search', dato che ero nel mezzo di correggere il mio post da utilizzare. – lonesomeday

+0

Questa sembra una soluzione molto elegante, tuttavia, quando cerco di implementarla, mi sento confuso su cosa dovrebbe fare la funzione? Se lo copio direttamente da qui ottengo: Errore di analisi: errore di sintassi, T_FUNCTION imprevisto ---- Mi sento come se dovessi creare una funzione per fare il confronto? (scusa anche l'equivoco ... senza dubbio ho un momento di ritardo) ... modifica: leggere questo http://php.net/manual/en/function.usort.php sembra renderlo un po 'più chiaro , ma ancora bloccato! – Tisch

2

Si potrebbe creare un meccanismo di looping nidificato per abbinare l'ordine e ids e ricostruire un nuovo array palo.

$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 

     } 

    } 

} 
+0

Fare una copia di entrambi gli array (questo è ciò che fa foreach) è superfluo qui. –

+0

Grazie per la risposta. Questo fa il lavoro, tuttavia sembra un po 'pigro? Ho accettato la risposta in ogni caso perché fa quello che sto cercando, e funziona con PHP 5.2 – Tisch

+0

sorry @jondavidjohn, ho dovuto passare alla soluzione più veloce. Grazie ancora. – Tisch

2
$sortOrderMap = array_flip($postIds); 

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

Si può semplicemente sottrarre b da un invece di a da b per ordinare l'altra direzione

+0

grazie anche per la tua risposta ... La soluzione di cui sopra è molto simile, quindi seguirò quella, se possibile. Sembra che PHP 5.2 mi stia fermando però :( – Tisch