Сортировка трехмерного массива

#php #arrays #sorting

#php #массивы #сортировка

Вопрос:

У меня есть массив, подобный этому

 Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [szam] => 8
                    [index] => 0
                )

        )

    [1] => Array
        (
            [0] => Array
                (
                    [szam] => 1
                    [index] => 0
                )

            [1] => Array
                (
                    [szam] => 7
                    [index] => 1
                )

        )
  

Я думал, что мой последний cmp будет работать нормально

 function maxSzerintCsokkeno($item1,$item2)
{
    if ($item1['szam'] == $item2['szam']) return 0;
    return ($item1['szam'] < $item2['szam']) ? 1 : -1;
}
  

с помощью foreach

 foreach ($tomb as $kulcs => $adat)  usort($adat,"maxSzerintCsokkeno");
  

но это ничего не дает, посоветуйте?

Ответ №1:

 foreach ($tomb as $kulcs => $adat)  usort($adat,"maxSzerintCsokkeno");
  

Это сортирует только массив подмассивов $adat. И это существует только временно, пока foreach не выполнит цикл над следующим. Ленивым вариантом здесь было бы использовать ссылку:

 foreach ($tomb as amp; $adat)  usort($adat,"maxSzerintCsokkeno");
  

Обратите внимание на amp; . Таким образом, изменение в $adat будет применено непосредственно к родительскому массиву.

Ответ №2:

Вы сортируете временную переменную, что означает, что изменения не применяются. У вас должно сработать следующее:

 for($i = 0, $length = count($tomb); $i < $length; $i  )
{
    usort($tomb[$i], "maxSzerintCsokkeno");
}
  

Ответ №3:

При повторении цикла foreach переменные ключа и значения ( $kulcs и $adat в вашем коде) являются копиями фактических значений в массиве. Как сказал Тим Купер, вы фактически сортируете копию исходного значения.

Вы также можете передать значение по ссылке в вашем цикле foreach. Это означает, что вы будете изменять исходное значение:

 foreach ($tomb as $kulcs => amp;$adat)  usort($adat,"maxSzerintCsokkeno");