2016-07-18 1 views
0

Я хотел бы отсортировать массив массивов на основе элемента этих последних (поле «clock», type = string). Мой массив имеет следующую модель: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 ...)) 

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

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 ($fusion as &$fus){ 
+2

foreach ($ fusion as & $ fus) {? – splash58

+0

@ splash58 Я хочу сделать сортировку на каждом массиве Array_X. Все они содержатся в массиве под названием '$ fusion'. – morandmr

+0

i mean - add '&' – splash58

ответ

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) 
+0

Это то, что я изначально хотел сделать. Благодаря ! – morandmr

Смежные вопросы