2016-10-05 3 views
0

Ich habe zwei Arrays, ist man ein mehrdimensionales Array, das Informationen enthält, die andere ein einfaches Array ist, die Werte für den Auftrag hält ich in der ersten Reihe wollenPHP - Sortierung ein assoziatives Array von einem anderen Array Werte

. Zum Beispiel möchte ich, dass mein erstes Array nach ID sortiert ist, nach den Werten im zweiten Array.

$ users-Array:

array(3) { 
    [0] => array(3) { 
      'id' => 1, 
      'name' => 'John Smith', 
      'email' => '[email protected]', 
     }, 
    [2] => array(3) { 
      'id' => 2, 
      'name' => 'Jane Smith', 
      'email' => '[email protected]', 
     }, 
    [0] => array(3) { 
      'id' => 3, 
      'name' => 'Jack Smith', 
      'email' => '[email protected]', 
     }, 
} 

$ order Array:

array(3) { 
    [0] => '2', 
    [1] => '3', 
    [2] => '1', 
} 

Was ich über den Ausgang des sortierten Array sein möchte:

array(3) { 
    [0] => array(3) { 
      'id' => 2, 
      'name' => 'Jane Smith', 
      'email' => '[email protected]', 
     }, 
    [2] => array(3) { 
      'id' => 3, 
      'name' => 'Jack Smith', 
      'email' => '[email protected]', 
     }, 
    [0] => array(3) { 
      'id' => 1, 
      'name' => 'John Smith', 
      'email' => '[email protected]', 
     }, 
} 

So wie Sie können siehe, ich möchte, dass die Array-Schlüssel neu indiziert werden, so dass sie immer sequentiell von 0 ausgehen, aber für die Werte jedes Elements i n Das Array $ users wird neu angeordnet.

+0

einen Blick auf [array_multisort] (http://php.net/manual/en/function.array-multisort.php) – christophe

Antwort

0

Ich denke, dass dies die Arbeit machen soll:

$array = array(
    array(
      'id' => 2, 
      'name' => 'Jane Smith', 
      'email' => '[email protected]', 
    ), 
    array(
      'id' => 3, 
      'name' => 'Jack Smith', 
      'email' => '[email protected]', 
    ), 
    array(
      'id' => 1, 
      'name' => 'John Smith', 
      'email' => '[email protected]', 
    ), 
); 

function cmp_by_optionNumber($a, $b) { 
    return $a["id"] - $b["id"]; 
} 
usort($array, "cmp_by_optionNumber"); 

var_dump($array); 

Es wird Ihre Hauptarray durch die Werte der „id“ Schlüssel in dem Sub-Arrays sortieren.

+0

Das beantwortet nicht die Frage – Thomas

0

können Sie usort verwenden, um dies zu erreichen:

 // the key order of each id 
     $orderIdKeys = array_flip($order); 

     usort($users, function ($u1, $u2) use ($orderIdKeys) { 

      // compare the keys of the ids in the $order array 
      return $orderIdKeys[$u1['id']] >= $orderIdKeys[$u2['id']] ? 1 : -1; 
     }); 

Dann $users bestellt werden sollte.

Die usort hier Nutzer basierend auf der Position vergleicht jeder Benutzer-ID in $ Reihenfolge Array (die $orderIdKeys[$u1['id']] ist) Wenn die Position von $u1['id'] größer als die Position von $u2['id'] kehrt der Callback-1, was bedeutet, $u2 sollte in der endgültigen geordneten Anordnung

0

Sie können dies tun, wie dies vor $u1 platziert werden:

// Index users by ID 
$users = array_combine(
    array_column($users, 'id'), 
    $users 
); 

// Order the users 
$users = array_map(function ($id) use ($users) { 
    return $users[$id]; 
}, $order); 

Hier habe ich array_combine() Funktion verwendet, die Array durch Zuordnen von Schlüsseln zu Werten erstellt. Für die Schlüssel verwendete ich alle IDs in einer sequenziellen Reihenfolge (packte sie mit array_column()).

Mit einem Array in dieser Form kann ich über $order Array Schleife und greifen Sie die Werte von $users Array nach Index, die tatsächlich den Wert von id jetzt haben.

Anstelle der Schleife mit foreach habe ich array_map() Funktion verwendet. Wenn Sie eine Sammlung (d. H. Array) haben, ist es besser, higher order functions zu verwenden, um sie zu verarbeiten. Wenn du ein Anfänger bist, kann es überwältigend sein, aber du musst das lernen, so wie es heutzutage gemacht wird.

Here is working example.