2011-07-04 57 views
0

我有一个数组与数组在PHP中的数组,我想根据每个元素内的字段排序数组的顶层,我也想排序数组基于该元素的数组的元素在每个元素内。 (见例子)。我想要它,所以最后,$data第一个项目的'primary'价值'第一'然后'第二'。我也希望它在'第一'和'第二'的范围内,'secondary'字段下的数组首先具有'val''foo'然后'bar'(对'第一'和'第二')使用usort排列数组阵列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是年底,当您添加&变量会本身和以前一样foreach

- 比foreach不可复制的变量,并参考使用它

+0

谢谢!我觉得那是发生了什么,但不知道要用'&'。 – Max