PHP按字母顺序排列foreach顺序

时间:2017-01-31 16:04:20

标签: php arrays usort

我想弄清楚为什么我的代码不会像我期望的那样工作。我有一个数组:

$persons = array(
    0 => array(
        'person' => 'John',
        'children' => array('Eve', 'Mark', 'Alto')
    ),
    1 => array(
        'person' => 'Susy',
        'children' => array('Ruby', 'Adam', 'Tõnu')
    )
);

循环数组并按字母顺序对子项进行排序

foreach( $persons as $person ) {

    usort($person['children'], function( $a, $b ) {
        return strcmp( $a, $b );
    });
    var_dump($person['children']); //shows children array items alphabetically ordered

}

但是,在foreach chidrens仍处于起步阶段之后

var_dump($persons); //shows that children names are not ordered alphabetically

感谢您的时间

1 个答案:

答案 0 :(得分:0)

foreach循环正在创建实际上是循环内数组值的副本。副本已排序但不会更改原始数组。为此,您可以使用&

作为参考
foreach ($persons as &$person) {

来自documentation

  

在每次迭代中,当前元素的值被赋值为$ value,内部数组指针被提前一个......为了能够直接修改循环内的数组元素,在$ value之前加上&amp ;.在这种情况下,该值将通过引用分配。

直接引用数组的另一种方法是迭代索引并引用元素:

for ($i = 0; $i < count($persons); $i++) {
    usort($persons[$i]['children']), function($a, $b) {
        return strcmp($a, $b);
    });
}