PHP сортировать 2d массив по индексу (неассоциативно) - PullRequest
3 голосов
/ 24 ноября 2010

Этот код не работает должным образом, но он предлагает то, что я пытаюсь сделать:

function sort_2d_by_index($a,$i) {
  function cmp($x, $y) {
    // Nested function, can't find $i
    // (global $i defeats the purpose of passing an arg)
    if ($x[$i] == $y[$i]) { return 0; }
    return ($x[$i] < $y[$i]) ? -1 : 1;
  }

  usort($a,"cmp");
  return $a;
}

Должен быть намного лучший способ сделать это.Я изучал ksort(), multisort() и все виды, пока не устаю пытаться разобраться во всем.

Ситуация такова: у меня есть 2-d массив ...

array(
  array(3,5,7),
  array(2,6,8),
  array(1,4,9)
);

... и я хочу отсортировать по индексу столбца.Скажем, столбец [1] даст такой результат:

array(
  array(1,4,9),
  array(3,5,7),
  array(2,6,8)
);

Есть ли у кого-то ссылка (я уверен, что об этом спрашивали раньше), или кто-то может сказать: «Вам нужен foosort, определенно».Большое спасибо.

Ответы [ 3 ]

8 голосов
/ 24 ноября 2010

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

Нельзя избежать создания массива, состоящего только из одного столбца.:

$sort_column = array();
foreach ($a as $row)
    $sort_column []= $row[1]; // 1 = your example

array_multisort($sort_column, $a);

Это сортирует оба массива синхронно, так что впоследствии весь ваш массив сортируется в том же порядке, что и массив $ sort_column.

Начиная с PHP 5.3 вы можете использовать замыкание (передача $i в функцию) путем определения функции cmp следующим образом:

$cmp = function($x, $y) use ($i) { ... };
1 голос
/ 24 ноября 2010

Вы можете использовать use для доступа $i:

function cmp($x, $y) use ($i) {
    // $i now available
    if ($x[$i] == $y[$i]) { return 0; }
    return ($x[$i] < $y[$i]) ? -1 : 1;
}
0 голосов
/ 24 ноября 2010

http://www.php.net/manual/en/function.sort.php#99419

phpdotnet at m4tt dot co dot uk

Простая функция для сортировки массива по определенному ключу. Поддерживает связь индекса.

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