2016-03-25 10 views
1

私はuriでソートしようとしている。この多次元配列多次元配列内でusortを使用するには?

[ 
    "/api/dns" => [ 
     0 => [ 
      "method" => "GET", 
      "uri" => "foo0" 
     ], 
     1 => [ 
      "method" => "GET", 
      "uri" => "foo1" 
     ], 
     2 => [ 
      "method" => "GET", 
      "uri" => "foo2" 
     ] 
    ], 
    "/api/servers" => [ 
     0 => [ 
      "method" => "GET", 
      "uri" => "foo0" 
     ], 
     1 => [ 
      "method" => "GET", 
      "uri" => "foo1" 
     ], 
     2 => [ 
      "method" => "GET", 
      "uri" => "foo2" 
     ] 
    ] 
]; 

を持っています。

Undefined index: uri

私はこれを追加しようとしました:

は、私はこのような usortを試してみました:

usort($myArray, function ($a, $b) { 
    return $a['uri'] - $b['uri']; 
}); 

をしかし、ソートが右アレイ上で行われていないので、私はエラーを得たので、これが動作しませんforeach内で結果なしで機能します。並べ替えが正しい配列で行われているため、なぜこれが機能していないのか分かりません。

foreach ($myArray as $key) { 
    usort($key, function ($a, $b) { 
     return $a['uri'] - $b['uri']; 
    }); 
} 

これはusortで可能ですか?

uriでソートするにはどうすればよいですか?

+2

各サブアレイをソートするか、配列全体をソートし、必要に応じてサブアレイを移動しますか? (foreach($ myArray as $ key) ')> – Rizier123

+2

あなたの' uri'キーが英数字である場合、 '$ a [ 'uri'] - $ b ['uri'] 'は動作しません。代わりに['strcmp'](http://php.net/manual/en/function.strcmp.php)を使用してください。 – fusion3k

+1

@ Rizier123 'foreach'で' usort'を使うためには、 'foreach($ myArray as&$ key)'を参照する必要があります。デフォルトでは '$ key'はコピーです。 'foreach'の後で破壊されるのでコピーをソートする必要はありません –

答えて

1

最初のレベルをループするときに、&記号を使用してサブアレイを「参照」で変更します。

コード:(デモ:https://3v4l.org/DthZW

foreach($myArray as &$subarray){ // modify by reference 
    usort($subarray,function($a,$b){ 
     return $a['uri']<=>$b['uri']; // use spaceship operator for ASC sorting 
    }); 
} 
var_export($myArray); 

あなたが&を使用したくない場合は、反復として、その後は上書きすることができます。

コード:(デモ:https://3v4l.org/sOEqZ

foreach ($myArray as $key=>$subarray){ 
    usort($subarray,function($a,$b){ 
     return $a['uri']<=>$b['uri']; 
    }); 
    $myArray[$key]=$subarray; // overwrite 
} 

また、あなたはarray_column()array_multisort()を組み合わせることができます

foreach($myArray as &$subarray){ 
    array_multisort(array_column($subarray,'uri'),$subarray); 
} 
var_export($myArray); 

をそして再び、あなたにもこれを繰り返し上書きを行うことができます。