2011-07-04 30 views
0

私はPHPで配列を持つ配列の配列を持っており、各要素内のフィールドに基づいて配列のトップレベルをソートしたいと思います。その要素の配列の要素に基づいて各要素内に配置されます。 (例を参照)。最後に、$dataには、最初に'primary'の値が「first」、次に「second」の項目があります。私はまた、 'first'と 'second'の中で、フィールド'secondary'の配列は、最初に 'foo'と 'bar'( 'first'と 'second'の両方)の'val'の項目を持っています。配列を使って配列の配列をソートするPHP

$data = array (
    array (
     'myid'  => 4, 
     'primary' => 'second', 
     'secondary' => array (
      array (
       'myid' => 10, 
       'val' => 'bar', 
      ), 
      array (
       'myid' => 8, 
       'val' => 'foo', 
      ), 
     ), 
    ), 
    array (
     'myid'  => 2, 
     'primary' => 'first', 
     'secondary' => array (
      array (
       'myid' => 10, 
       'val' => 'bar', 
      ), 
      array (
       'myid' => 8, 
       'val' => 'foo', 
      ), 
     ), 
    ), 
); 

function mysort($a, $b) { 
    return $a['myid'] > $b['myid']; 
} 

echo "pre sort:\n"; 
print_r($data); 

usort($data, 'mysort'); 

echo "post top level sort:\n"; 
print_r($data); 

foreach ($data as $k=>$item) { 
    usort($item['secondary'], 'mysort'); 
    echo "Second Level Item sort:\n"; 
    print_r($item['secondary']); 
} 

echo "post second level sort:\n"; 
print_r($data); 

次の最終出力が得られるのはなぜですか?

post second level sort: 
Array 
(
    [0] => Array 
     (
      [myid] => 2 
      [primary] => first 
      [secondary] => Array 
       (
        [0] => Array 
         (
          [myid] => 10 
          [val] => bar 
         ) 

        [1] => Array 
         (
          [myid] => 8 
          [val] => foo 
         ) 

       ) 

     ) 

    [1] => Array 
     (
      [myid] => 4 
      [primary] => second 
      [secondary] => Array 
       (
        [0] => Array 
         (
          [myid] => 10 
          [val] => bar 
         ) 

        [1] => Array 
         (
          [myid] => 8 
          [val] => foo 
         ) 

       ) 

     ) 

) 

ところで、私はPHP 5.2.17を使用しています。これがそうであるのはなぜ

答えて

0

この

foreach ($data as $k=>&$item) { 
    usort($item['secondary'], 'mysort'); 
    echo "Second Level Item sort:\n"; 
    print_r($item['secondary']); 
} 

を試してみてください?

デフォルトではforeachがすべてのヴァースをコピーするためです。あなたはforeachで変数を変更した場合
だからあなただけのローカル変数を変更し、foreachが終了された後、あなたが&を追加すると、変数がse foreach

前と同じになります - foreachよりも変数をコピーしていない、参照することによって、それを使用して

+0

ありがとうございます!私はそれが何が起こっているのかと考えましたが、 '&'を使うことは知らなかった。 – Max