php — сортировать по значению последнего ключа в массиве?

#php #sorting #multidimensional-array

#php #сортировка #многомерный-массив

Вопрос:

Я пытаюсь выяснить, как отсортировать массив по значению последнего ключа, когда количество ключей неизвестно?

Итак, если у меня есть массивы, которые выглядят следующим образом:

 Array(
  [0] => Array(
      [0] => Bob 
      [1] => A 
      [2] => Parker
  )
  [1] => Array(
      [0] => John 
      [1] => Smith-Doe
  )
  [2] => Array(
      [0] => Giuseppe 
      [1] => Gonzalez
      [2] => Octavio
      [3] => Hernandez
  )
)
  

Я хочу отсортировать его по последнему значению в массиве:

  • Джузеппе Гонсалес Октавио Эрнандес
  • Боб А. Паркер
  • Джон Смит-Доу

Ответ №1:

 $arr = array(
    array('Bob', 'A', 'Parker'),
    array('John', 'Smith-Doe'),
    array('Giuseppe', 'Gonzalez', 'Octavio', 'Hernandez')
);

usort($arr, 'sort_by_last_item');

var_dump($arr);

function sort_by_last_item($a, $b)
{
    return end($a) > end($b);
}
  

или если вы используете php 5.3:

 $arr = array(
    array('Bob', 'A', 'Parker'),
    array('John', 'Smith-Doe'),
    array('Giuseppe', 'Gonzalez', 'Octavio', 'Hernandez')
);

usort($arr, function($a, $b) { return end($a) > end($b); });

var_dump($arr);
  

Комментарии:

1. 1 за хороший ответ (и если бы я мог второй раз для лямбда-выражения)

Ответ №2:

 $data  = array( /* your data */ );
$output = array();

foreach ( $data as $v ) {
    $output[ end($v) ] = $v;
}

ksort($output);

var_dump($output);
  

в качестве альтернативы:

 $data  = array( /* your data */ );
$output = array();

foreach ( $data as $v ) {
    $key = implode(' ', array_reverse($v));
    $output[ $key ] = $v;
}

ksort($output);

var_dump($output);
  

Второй метод позволяет вам иметь много записей с одним и тем же последним элементом и сортировать по последним элементам, а если они равны — сортировать по предпоследнему и так далее…

Ответ №3:

Это работает:

 function array_last_item_sort($array){
    $return = array();
    $sort = array();

    foreach($array as $i => $item){
        $sort[$i] = $item[count($item) - 1];
    }

    asort($sort);

    foreach($sort as $i => $value){
        $return[] = $array[$i];
    }

    return $return;
}