2016-10-05 17 views
0

私は2つの配列を持って、1が情報を保持している多次元配列、他のは私が最初の配列をしたいための値を保持している単純な配列であるPHP - 。別の配列の値で連想配列をソート

たとえば、私の最初の配列を2番目の配列の値でIDで並べ替えることができます。

$ユーザーの配列:

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]', 
     }, 
} 

$順配列:私はあることをソートされた配列の結果をしたいと思い何

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

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]', 
     }, 
} 

そうすることができますように参照してください、私は配列のキーが再インデックスされるようにしたいので、常に0から始まるシーケンシャルですが、各要素の値はi $ users配列を並べ替えます。

+0

これは質問に答えていない – christophe

答えて

0

私は、これは仕事をすべきだと思う:

$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); 

それはサブアレイの「ID」キーの値によって、あなたの主な配列をソートします。

+0

[array_multisort](http://php.net/manual/en/function.array-multisort.php)を見てみましょう – Thomas

0

あなたはこれを達成するためにusortを使用することができます。

 // 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; 
     }); 

はその後 $usersを注文する必要があります。

$u1['id']位置は、コールバックが1つのどの手段を返す$u2['id']位置より大きい場合、ここでusortは、$順序アレイ内の各ユーザID($orderIdKeys[$u1['id']]ある)の位置に基づいてユーザを比較しています$u2は、あなたがこのようにこれを行うことができ、最終的な秩序配列

0

$u1前に配置する必要があります。

// 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); 

ここでは、array_combine()関数を使用して、与えられたキーを値にマッピングすることによって配列を作成します。キーの場合、私はすべてのIDを順番に使用しました(array_column()でそれらをつかんでいます)。

このような配列の配列を持つと、私は$order配列をループし、$users配列の値を実際にはidという値で取得できます。

foreachでループする代わりに、array_map()機能を使用しました。コレクション(配列)をお持ちの場合は、higher order functionsを使用して処理する方がよいでしょう。あなたが初心者の場合は圧倒的かもしれませんが、これは今行われている方法なので、これを学ばなければなりません。

Here is working example.