簡體   English   中英

PHP中的多維數數組排序

[英]Sorting multidimensional number array in 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)
);

現在我想按“列”對它們進行排序。 這意味着,必須對第一列數字(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");

我怎樣才能做到這一點? 謝謝

這是可能的解決方案:

  1. 擺脫“令牌”,即制作二維數組
  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";
}

Output:

100    23     72     2      17     
293    28     283    23     28     
842    240    348    98     114    

我認為這會做你所追求的。 我這里做了一些假設(比如$array真的是一個數組,至少有一個子數組,所有子數組都以token為key,所有子數組元素個數相同)。

<?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>';
}

Output:

數組(1){ [“令牌”]=> 數組(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) } }

你不能只是

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

還是我誤解了這個問題?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM