2016-06-09 2 views
0

У меня есть вопрос Так что у меня этот массив:Рекурсивный ksort: не сортировать массив

Array 
(
[2016] => Array 
    (
     [23] => Array 
      (
       [total_auctions] => 0 
       [total_price] => 0 
      ) 

     [22] => Array 
      (
       [total_auctions] => 0 
       [total_price] => 0 
      ) 

     [21] => Array 
      (
       [total_auctions] => 0 
       [total_price] => 0 
      ) 

     [20] => Array 
      (
       [total_auctions] => 0 
       [total_price] => 0 
      ) 
) 

Я хочу, чтобы отсортировать рекурсивный по ключу. Поэтому я создаю METHODE:

public function sortNestedArrayAssoc($a) 
{ 
    if (!is_array($a)) { 
     return false; 
    } 
    ksort($a); 
    foreach ($a as $k=>$v) { 
     $this->sortNestedArrayAssoc($a[$k]); 
    } 
    return true; 
} 

Но я получаю тот же результат, массив с ключом 23 является первым, и я не»действительно понять, где проблема. Не могли бы вы мне помочь ? Thx заранее и извините за мой английский

+3

Вам необходимо, чтобы метод arg передавался по ссылке. –

ответ

4

Как указано John Stirling, что-то, что вы могли бы сделать, это передать ваш arguments by reference. Вы можете сделать это, используя оператор & в аргументе метода. Синтаксис для этого будет (с единственным изменением является первой линии):

public function sortNestedArrayAssoc(&$a) 
{ 
    if (!is_array($a)) { 
     return false; 
    } 
    ksort($a); 
    foreach ($a as $k=>$v) { 
     $this->sortNestedArrayAssoc($a[$k]); 
    } 
    return true; 
} 

Это означает, что вы затем передать переменную в вашу функцию и изменить его непосредственно вместо того, что PHP делает обычно что пропускать копия переменной в вашу функцию. ksort - пример функции, которая использует определение по ссылке в определении своей функции.

Если вы решительно против использования прохода по ссылке, вам придется изменить свой код, чтобы вернуть переменную/массив в область вызова, где вы затем обновите свой массив.

public function sortNestedArrayAssoc($a) 
{ 
    if (is_array($a)) { 
     ksort($a); 
     foreach ($a as $k=>$v) { 
      $a[$k] = $this->sortNestedArrayAssoc($v); 
     } 
    } 
    return $a; 
} 
+0

Какая польза от его передачи вместо ссылки? – SML

+0

Предпочтение по большей части. Вы будете экономить на использовании памяти, используя pass by reference (поскольку PHP не должен делать копию вашей переменной, он просто изменит ее на месте). – MasterOdin

+0

Спасибо за ваш ответ. Кажется, что пропуск по ссылке медленнее в производительности, поэтому я просто не был уверен, когда его использовать. http://stackoverflow.com/questions/178328/in-php-5-0-is-passing-by-reference-faster – SML

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