排序不规则的php数组

时间:2011-07-28 17:35:19

标签: php

我正在尝试对不规则的php数组进行排序。这是不规则的,因为结构不同于普通的php数组。我通常能够使用usort对数组进行排序,但是这个php数组的结构使得很难使用。这是数组的基本结构:

            Array
(
    [id] => Array
        (
            [0] => 3220604
            [1] => 5341522
            [2] => 1234568144
            [3] => 11
        )

    [firstname] => Array
        (
            [0] => Sam
            [1] => Donald
            [2] => Keesh
            [3] => Eat
        )

    [lastname] => Array
        (
            [0] => Fisher
            [1] => Duck
            [2] => Smelley
            [3] => Me
        )

)

我正在尝试按ID排序,但当然,如果我使用usort,它会尝试按最高阶数组排序,例如id,first和last。我如何用这种结构对数组进行排序?

8 个答案:

答案 0 :(得分:2)

呃。

怎么样: ((11,'Sam','Fisher'),(2352335,'Name','Last'),...)

这样,ID与其他信息位相关联。目前,不同阵列之间没有实际关系,除了你头脑中的任何东西。它们不像表格的行/列。

答案 1 :(得分:2)

您可以使用array_multisort执行此操作:

$arr = array(
    'id' => array(3220604, 5341522, 1234568144, 11),
    'firstname' => array('Sam', 'Donald', 'Keesh', 'Eat'),
    'lastname' => array('Fisher', 'Duck', 'Smelley', 'Me')
);

array_multisort($arr['id'], $arr['firstname'], $arr['lastname']);
var_dump($arr);

这里array_multisort对第一个数组的值进行排序,并相应地对其他数组的值进行排序。

但使用不同的数据结构也是可取的。

答案 2 :(得分:1)

您应该将数组重组为:

array(array('id' => 1, 'first_name' => 'David', 'last_name' => 'Smith'))

这将使您的生活更轻松。从这里查看函数http://www.whypad.com/posts/php-sort-multi-dimensional-array/848/

function sortMultiArray(&$array, $key) {
    foreach($array as &$value) {
        $value['__________'] = $value[$key];
    }
    /* Note, if your functions are inside of a class, use:
        usort($array, array("My_Class", 'sort_by_dummy_key'));
    */

    usort($array, 'sort_by_dummy_key');

    foreach($array as &$value) {   // removes the dummy key from your array
        unset($value['__________']);
    }
    return $array;
}

function sort_by_dummy_key($a, $b) {
    if($a['__________'] == $b['__________']) return 0;
    if($a['__________'] < $b['__________']) return -1;
    return 1;
}

答案 3 :(得分:0)

这可能会帮助你:

http://www.php.net/manual/en/function.usort.php

这允许您指定比较函数sort()。

答案 4 :(得分:0)

如果您只想按ID排序,则可以

asort($aryName['id']);

这将对ID进行排序,但保持其密钥正确以引用人员姓名。

你可以用同样的方式对其他子阵列进行排序

asort($aryName['id']);
asort($aryName['firstname']);
asort($aryName['lastname']);

答案 5 :(得分:0)

你能改变阵列的结构吗?现在概述的方式是糟糕的设计。

类似的东西:

array
(
    0 => array(
        'id'        => 3220604,
        'firstname' => 'Sam',
        'lastname'  => 'Fisher'
    ),

    1 => array(
        'id'        => 5341522,
        'firstname' => 'Donald',
        'lastname'  => 'Duck'
    ),
);

然后你可以使用usort函数(如上所述)进行排序。更重要的是,您的数据将以更合理,更易于处理的方式存储。

答案 6 :(得分:0)

可能正在构建像

这样的数组
$allInOneArray= array (
   "id1"  => array("firstname" => "Peter", "lastname" => "Paul"),
   "id2"  => array("firstname" => "Mary", "lastname" => "May")
   //etc
);

将使排序更容易。

答案 7 :(得分:0)

在经典的usort()解决方案之前和之后使用此函数

function transpose($M){
  foreach ($M as $row=>$cols) foreach ($cols as $col=>$value) $Mt[$col][$row]=$value;
  return ($Mt);           
}