Сортировка многомерного массива чисел в PHP - PullRequest
0 голосов
/ 08 июня 2011

У меня проблемы с сортировкой многомерного массива.

Массив выглядит так:

$array = array(
  array("token" => array(100, 240, 348, 23, 17),
  array("token" => array(293, 28, 283, 2, 28),
  array("token" => array(842, 23, 72, 98, 114)
);

Теперь я хочу отсортировать их по «столбцу».Это означает, что первый столбец чисел (100, 293, 842) должен быть отсортирован, затем второй столбец (но с сохранением первого столбца как есть! Может случиться, что столбцы имеют одинаковое число с несколькими строками) и т. Д..

На самом деле я пытался сделать это с помощью usort (), но это будет работать только при сортировке первого столбца:

function do_sort($a, $b) {
  $tok_a = $a["token"];
  $tok_b = $b["token"];

  if ($tok_a[0] <= $tok_b[0])
    return false;
  else
    return true;
}

usort($array, "do_sort");

Как я могу это сделать?Спасибо

Ответы [ 3 ]

2 голосов
/ 08 июня 2011

Вот возможное решение:

  1. избавиться от 'токена', т.е. создать 2D массив
  2. поменять столбцы и строки ( транспонировать массив)
  3. сортировать каждый столбец
  4. поменять местами столбцы и строки (получить исходную структуру)
  5. положить токен обратно

Код:

function array_transpose(array $array) {
    $result = array();
    foreach ( $array as $rowNum => $row ) {
        foreach ( $row as $colNum => $value ) {
            $result[$colNum][$rowNum] = $value;
        }
    }
    return $result;
}

$array = array(
  array("token" => array(100, 240, 348, 23, 17)),
  array("token" => array(293, 28, 283, 2, 28)),
  array("token" => array(842, 23, 72, 98, 114)),
);

// get rid of 'token'
foreach ( $array as &$item ) {
    $item = $item['token'];
}
unset($item);

// swap columns and rows
$array = array_transpose($array);

// sort columns
foreach ( $array as &$item ) {
    sort($item);
}
unset($item);

// swap back columns and rows
$array = array_transpose($array);

// put 'token' back
foreach ( $array as &$item ) {
    $item = array('token' => $item);
}
unset($item);

// display results
foreach ( $array as $row ) {
    foreach ( $row['token'] as $value ) {
        printf('%-7d', $value);
    }
    echo "\n";
}

Выход:

100    23     72     2      17     
293    28     283    23     28     
842    240    348    98     114    
1 голос
/ 08 июня 2011

Я думаю, что это будет делать то, что вы после.Я сделал здесь некоторые предположения (например, $array - это на самом деле массив, имеет по крайней мере один под-массив, все под-массивы имеют token в качестве ключа, и все под-массивы имеютстолько же элементов).

<?php

$array = array(
  array("token" => array(100, 240, 348, 23, 17)),
  array("token" => array(293, 28, 283, 2, 28)),
  array("token" => array(842, 23, 72, 98, 114)),
);

$count_outer = count($array);
$count_inner = count($array[0]['token']);

for ($i=0; $i < $count_inner; $i++) {
    $temp_arr = array();

    for ($j=0; $j < $count_outer; $j++) {
        $temp_arr[] = $array[$j]['token'][$i];
    }
    sort($temp_arr);

    for ($j=0; $j < $count_outer; $j++) {
        $array[$j]['token'][$i] = $temp_arr[$j];
    }
}

foreach ($array as $value) {
    var_dump($value);
    echo '<br>';
}

Вывод:

array (1) {["token"] => array (5) {[0] => int(100) [1] => int (23) [2] => int (72) [3] => int (2) [4] => int (17)}} array (1) {["token"] => array (5) {[0] => int (293) [1] => int (28) [2] => int (283) [3] => int (23) [4] => int(28)}} array (1) {["token"] => array (5) {[0] => int (842) [1] => int (240) [2] => int (348) [3] => int (98) [4] => int (114)}}

0 голосов
/ 08 июня 2011

Разве вы не можете просто

foreach ($array as &$item) {
  sort($item['token']);
}

Или я неправильно понял вопрос?

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