2017-01-31 2 views
1

J'essaye de comprendre pourquoi mon code ne fonctionnera pas comme je m'attends. J'ai un tableau:PHP usort à l'intérieur pour chaque ordre alphabétiquement

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

boucle tableau et enfants trier par ordre alphabétique

foreach($persons as $person) { 

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

} 

Mais après chidrens foreach sont encore en ordre de départ

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

Merci pour votre temps

Répondre

0

La boucle foreach crée ce qui est effectivement une copie du tableau val ue dans la boucle. La copie est triée mais ne modifie pas le tableau d'origine. Pour ce faire, vous pouvez faire une référence avec &:

foreach ($persons as &$person) { 

De l'documentation: A chaque itération

, la valeur de l'élément courant est affecté à la valeur de $ et le pointeur interne de tableau est avancé par un ... Afin de pouvoir modifier directement les éléments du tableau dans la boucle, précedez $ value avec &. Dans ce cas, la valeur sera attribuée par référence.

Une autre façon de faire référence aux tableaux est directement pour itérer sur les indices de référence et les éléments:

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