【问题标题】:php - array sort on the first dimension of a 2D arrayphp - 对二维数组的第一维进行数组排序
【发布时间】:2012-04-03 03:25:32
【问题描述】:

我有这个数组结构

Array
(
    [xyz] => Array
        (
            [1] => 3
            [0] => s
        )

    [dds] => Array
        (
            [a] => 96
            [d] => 4

         )
...
)

如何对第一个维度进行排序,以便 dds 排在第一位。 ksort 不起作用(至少对我而言)。

TIA

编辑 这是我的简单代码。我将一个序列化的二维数组文件读入一个变量,并对其进行排序,没有什么复杂的,ksort 在我的一维数组上工作没有问题。如果我注释掉 ksort 行,那么它运行时不会出错。

$inputfile = "xxx/result.txt";    
$builta = file_get_contents($inputfile);
$built =unserialize($builta);
    $size = sizeof($built);
    echo $size;

    echo "<br><pre>";
    print_r ($built);
    echo "</pre>";

    ksort($built);

    echo "<br><pre>";
    print_r ($built);
    echo "</pre>";

没什么复杂的。

更新:在处理大型数组时遇到更多错误后,ksort 的问题似乎是由于没有足够的内存来对大型数组进行排序。 tpaksu 提供的解决方案是一个很好的解决方法。

【问题讨论】:

  • 让我们在这里明确一点:您使用的 ksort 函数错误。查看手册,看看它是如何工作的,玩得开心。知道怎么做就容易,不学会怎么做就很难。为了让您轻松开始:手册中的 ksort 在这里:php.net/ksort。始终阅读参数、返回类型并查看给出的示例。

标签: php sorting multidimensional-array


【解决方案1】:

使用ksort

ksort($array);

【讨论】:

  • 您好 Dogbert,这不起作用,我只是在询问之前尝试过。
  • 我的数组是$xxx,那么我有$xxx = ksort($xxx);
  • ksort 就地修改,不要将其结果分配回$xxx
  • @Interrobang,我尝试将另一个 var 分配给 ksort 结果,但它不起作用,ksort 似乎破坏了第二维。
  • @Jamex ksort 作用于数组的 reference,返回值只是一个布尔值。你应该只做$array = array(...); ksort($array);,这意味着你丢弃了返回值。该函数直接修改数组。
【解决方案2】:

我假设您的数组名称是 $my_array;那么你可以使用这样的东西:

<?php
$my_array = array(z => array(p=>1,gf=>"d"),v=>array(l=>"m",fr=>"3"));
var_dump($my_array);

$sorted_keys = array_keys($my_array);
sort($sorted_keys,SORT_STRING);
$new_array = array();

var_dump($sorted_keys);

foreach($sorted_keys as $key){
    $new_array[$key] = $my_array[$key];
}

var_dump($new_array);

?>

但是是的,ksort 会更好更简单。

编辑:对不起,我的错。使用 sort 作为内联函数是一个错误。这是更新、测试和工作的代码。

【讨论】:

  • 感谢 tpaksu,但这对我也不起作用,它错误为为 foreach() 提供的参数无效。是的,我确保变量名是正确的。
  • 感谢您的宝贵时间,代码运行良好,但确实消耗了大量内存(对于我的大型二维数组)。
  • 而不是将旧数组分配给新数组,您可以在调用旧数组时只使用 $sorted_keys 。它会快得多。
【解决方案3】:

有一个 PHP 函数 uksort(),它根据键对数组进行排序。但是你必须建立自己的比较函数。
你可以得到这个函数的文档here.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-17
    • 2017-05-25
    • 2022-01-10
    • 1970-01-01
    • 2018-08-17
    • 2015-09-17
    相关资源
    最近更新 更多