PHP: изменения при сортировке моего многомерного массива не регистрируются

Я хотел бы отсортировать массив массивов на основе элемента этих последних (поле «часы», тип = строка). Мой массив имеет следующую модель:

Fusion
|
| Array_1
| |
| | Array_1_1
| | | clock => "08:08"
| | | //Other fields
| | |
| |
| | Array_1_2
| | | clock => "04:51"
| | | //Other fields
| | | 
|
| Array_2
| ...

Я пробовал использовать функцию usort или сортировку выбором. Вот мой фактический код (сортировка выбором):

foreach ($fusion as $fus){
        for($i = 0 ; $i < count($fus) ; $i++){
            $min = $i;
            for($j = $i+1 ; $j < count($fus) ; $j++){
                //conversion from string to date to compare properly
                $date1 = date_create_from_format('H:i',$fus[$j]['clock']);
                $date2 = date_create_from_format('H:i',$fus[$min]['clock']);
                if($date1 < $date2){
                    $min = $j;
                }
            }
            if($min != $i){
                $tmp = $fus[$i];
                $fus[$i] = $fus[$min];
                $fus[$min] = $tmp;
            }
        }
    }

Когда я запускаю свой код, я вижу, что изменения в Arrays_X происходят хорошо, но когда я печатаю весь массив, изменения сортировки больше не присутствуют, например. :

Перед сортировкой:

Array ( 
[0] => Array ( [clock] => 16:49 //other fields ) 
[1] => Array ( [clock] => 00:04 ... ) 
[2] => Array ( [clock] => 22:01 ... ) )

После сортировки (ОК):

Array ( 
[0] => Array ( [clock] => 00:04 ... ) 
[1] => Array ( [clock] => 16:49 ... ) 
[2] => Array ( [clock] => 22:01 ... ) )

Со всем массивом (KO) :

[...]
Array ( 
[0] => Array ( [clock] => 16:49 ... ) 
[1] => Array ( [clock] => 00:04 ... ) 
[2] => Array ( [clock] => 22:01 ... ) )
[...]

Как видите, изменений больше нет.

Есть ли у вас какие-либо идеи ? Я не понимаю, почему изменения не регистрируются... Спасибо за помощь.

ОТВЕТ:

Благодаря splash58: добавьте '&' перед $fus в инструкции foreach:

foreach ($fusion as &$fus){

person morandmr    schedule 18.07.2016    source источник
comment
foreach ($fusion as &$fus){ ?   -  person splash58    schedule 18.07.2016
comment
@ splash58 Я хочу сделать сортировку для каждого массива Array_X. Все они содержатся в массиве с именем $fusion.   -  person morandmr    schedule 18.07.2016
comment
Проблема решена. Большое спасибо !   -  person morandmr    schedule 18.07.2016


Ответы (1)


С usort для каждого элемента:

<?php
$fusion = array(
    array(
        array(
        'clock' => '08:08'
        ),
        array(
        'clock' => '04:51'
        )
    ),
    array(
        array(
        'clock' => '11:47'
        ),
        array(
        'clock' => '04:23'
        )
    ),
);

foreach($fusion as &$item) {
    usort(
        $item, 
        function($a, $b)
        {
            $dateA =  date_create_from_format('H:i', $a['clock']);
            $dateB =  date_create_from_format('H:i', $b['clock']);

            return ($dateA > $dateB);
        }
    );
}

var_dump($fusion);

Вывод:

array (size=2)
  0 => 
    array (size=2)
      0 => 
        array (size=1)
          'clock' => string '04:51' (length=5)
      1 => 
        array (size=1)
          'clock' => string '08:08' (length=5)
  1 => &
    array (size=2)
      0 => 
        array (size=1)
          'clock' => string '04:23' (length=5)
      1 => 
        array (size=1)
          'clock' => string '11:47' (length=5)
person Progrock    schedule 18.07.2016
comment
Это то, что я изначально хотел сделать. Спасибо ! - person morandmr; 18.07.2016