Php сортировать сгруппированный массив - PullRequest
1 голос
/ 13 марта 2019

У меня есть этот массив:

    $test['name1'][256]=[
       'lead_data'=>[
           'date'=>'13.03.2019',
           'address'=>'addr1'
       ]
   ];
   $test['name1'][257]=[
       'lead_data'=>[
           'date'=>'12.03.2019',
           'address'=>'addr2'
       ]
   ];
   $test['name2'][259]=[
       'lead_data'=>[
           'date'=>'15.03.2019',
           'address'=>'addr4'
       ]
   ];
   $test['name2'][260]=[
       'lead_data'=>[
           'date'=>'18.03.2019',
           'address'=>'addr5'
       ]
   ];

Есть две группы 'name1' и 'name2'. Нужно отсортировать внутри массивов по дате, я сделал это:

function array_sort_inner_array($array, $on, $order=SORT_ASC){
          $new_array = array();
          $sortable_array = array();
          if (count($array) > 0) {
              foreach ($array as $k => $v) {
                  if (is_array($v['lead_data'])) {
                      foreach ($v['lead_data'] as $k2 => $v2) {
                          if ($k2 == $on) {
                              $sortable_array[$k] = $v2;
                          }
                      }
                  } else {
                      $sortable_array[$k] = $v['lead_data'];
                  }
              }
              switch ($order) {
                  case SORT_ASC:
                      asort($sortable_array);
                      break;
                  case SORT_DESC:
                      arsort($sortable_array);
                      break;
              }
              foreach ($sortable_array as $k => $v) {
                  $new_array[$k] = $array[$k];
              }
          }
          return $new_array;
      }



 $testSort =[];
   foreach ($test as $k=>$t){
       $testSort[$k]=array_sort_inner_array($t,'date',SORT_DESC);
   }

И я не хочу сортировать группы 'name1' и 'name2' по столбцу 'date'. Таким образом, имя «name2» должно быть первым, а группа «name1» - вторым, поскольку у «name2» есть дата «18 .03.2019», и это самое высокое значение. Понятия не имею, как это сделать. Пожалуйста, помогите мне, спасибо!

1 Ответ

0 голосов
/ 13 марта 2019

Я имел в виду использовать array_column и uasort как:

function getMaxDate($e) {
    return max(array_column(array_column($e, "lead_data"), "date"));
}

uasort($test, function ($a, $b) {return strcmp(getMaxDate($b), getMaxDate($a));;});

Обратите внимание - вам все еще нужно отсортировать внутренний массив, если хотите - я только показал, как выполнить внешнюю сортировку для максимальной даты - внутренняя сортировка может быть выполнена как:

foreach($test as &$e)
    uasort($e, function ($a, $b) {return strcmp($a['lead_data']['date'], $b['lead_data']['date']);;});

Ссылка: uasort , массив-столбец

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