PHP - Сортировать многомерный массив sububarray из значения

1

массив

array (
  [0] => array 
    (
      [field1] => 'name'
      [field2] => 'text'
      [field3] => array 
        (
          [0] => array 
            (
              [text] => 'This arrays order is to be kept!'
              [name] => 'Only sort the sub-sub-array below!'
              [order] => ''
            )
        )
    )

  [1] => array
    (
      [field1] => 'name'
      [field2] => 'text'
      [field3] => array 
        (
          [0] => array 
            (
              [text] => '2014'
              [name] => 'Dummy!'
              [order] => '1'
            )
          [1] => array 
            (
              [text] => '2013'
              [name] => 'Try me!'
              [order] => '2'
            )
          [2] => array 
            (
              [text] => '1985'
              [name] => 'Help!'
              [order] => '5'
            )
          [3] => array 
            (
              [text] => '2002'
              [name] => 'Please!'
              [order] => '4'
            )
          [4] => array 
            (
              [text] => '2007'
              [name] => 'Order!'
              [order] => '3'
            )
        )
    )
...

Цель

Я хочу сохранить массив 1-го и 2-го уровней, и он имеет значение как есть. Мне нужно отсортировать ключи во втором суб-массиве по значению в order -field. Поэтому, когда он говорит годы, этот суб-массив должен быть отсортирован ASC или DESC. и все остальные ключи/значения/структура/карта должны храниться как есть.

Сортированный массив:

array (
  [0] => array 
    (
      [field1] => 'name'
      [field2] => 'text'
      [field3] => array 
        (
          [0] => array 
            (
              [text] => 'This arrays order is to be kept!'
              [name] => 'Only sort the sub-sub-array below!'
              [order] => ''
            )
        )
    )

  [1] => array
    (
      [field1] => 'name'
      [field2] => 'text'
      [field3] => array 
        (
          [0] => array 
            (
              [text] => '2014'
              [name] => 'Dummy!'
              [order] => '1'
            )
          [1] => array 
            (
              [text] => '2013'
              [name] => 'Try me!'
              [order] => '2'
            )
          [2] => array 
            (
              [text] => '2007'
              [name] => 'Order!'
              [order] => '3'
            )
          [3] => array 
            (
              [text] => '2002'
              [name] => 'Please!'
              [order] => '4'
            )
          [4] => array 
            (
              [text] => '1985'
              [name] => 'Help!'
              [order] => '5'
            )
        )
    )

Помогите

Я потратил часы и часы на различные пользовательские решения, в основном на основе usort() но я также сделал это, зная, что ни один из этих вопросов и ответов не описывает ситуацию, которая у меня есть.

Я начинаю сомневаться, что это возможно. Кто-нибудь знает, если это так? И если да, можете ли вы пролить свет или дать подсказку/пример/демонстрацию?

Laravel 5.1

Я извлекаю это из модели Laravel и используя toArray();

Есть ли лучший способ добиться этого в Ларавеле, я был бы рад узнать.

  • 0
    Пожалуйста, опубликуйте массив, как он будет выглядеть после сортировки. Так что я могу понять, чего ты хочешь достичь.
  • 0
    Хорошо я понял
Теги:
arrays
multidimensional-array
sorting
laravel-5

2 ответа

0
Лучший ответ

Если под-subarray, который вы хотите сортировать, всегда идентифицируется одним и тем же ключом, вы можете просто добавить содержимое этого ключа.

foreach ($test as &$value) { 
      // Using a (^) reference to each value will sort the existing 
      // array instead of creating a sorted copy.
    usort($value['field3'], function($a, $b) {
        // You can use an anonymous function like this for the usort comparison function.
        if ($a['order'] < $b['order']) return -1;
        if ($a['order'] == $b['order']) return 0;
        // In case of 'order' ties, you may want to add a comparison of a different key
        return 1; // $a['order'] must be > $b['order'] at this point
    });
}

Обратите внимание, что функция сравнения, используемая в usort:

должно возвращать целое число, меньшее, равное или большее нуля, если первый аргумент считается менее чем, равным или большим, чем второй.

Возможно, лучше сделать это с помощью Laravel, потому что база данных, скорее всего, сможет выполнить эту сортировку быстрее, чем PHP, но нам нужно будет узнать гораздо больше о вашей модели, чтобы понять это, и это звучит, как в основном, полностью другой вопрос.

  • 0
    Кажется, это самый простой способ достичь моей цели, спасибо.
  • 0
    Пожалуйста.
0

Если я правильно понял проблему, это могло бы быть решением (в этих примерах $arr является переменной, содержащей массив):

function cmp($a, $b)
{    
    return ($a['order'] < $b['order']) ? -1 : 1;
}

foreach($arr as $key => $subarr){
    foreach($subarr as $key2 => $subsubarr){
        if(is_array($subsubarr)){             
                usort($subsubarr,"cmp");
                $subarr[$key2] = $subsubarr;
        }
    }
    $arr[$key] = $subarr;

}

или

function cmp($a, $b)
{    
    return ($a['order'] < $b['order']) ? -1 : 1;
}

foreach($arr as  &$subarr){
    foreach($subarr as  &$subsubarr){
        if(is_array($subsubarr)){               
                usort($subsubarr,"cmp");
        }
    }        
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню