PHP中的多维数组值排序

时间:2010-04-23 14:37:42

标签: php sorting arrays multidimensional-array

我正在构建一个包含一组数据库字段的数组,其中包含有关表,实际字段名称和描述性字段名称的信息,作为多维数组。以下是目前的情况:

$Fields['User']['ID'] = "User ID";
$Fields['User']['FirstName'] = "First Name";
$Fields['Stats']['FavouriteOrder'] = "Favourite Item Ordered";
$Fields['Geographic']['Location'] = "Current Location";
$Fields['Geographic']['LocationCode'] = "Current Location Code";

好的,这很好,但是我将这个系统导入到允许导出所选字段的系统中,最后我想通过不同级别foreach(),提取数据然后最终拥有所有描述性字段使用其描述性名称按字母顺序显示。所以最终的顺序是:当前位置,当前位置代码,最喜欢的项目订购,名字然后用户ID - 显然保持索引关联。

我不能使用usort()而且我不能使用array_multisort()...或者我可以而且我只是不知道如何。 usort()似乎需要一个键来排序,但我有变量键。 array_multisort()似乎与sort()真的一样。

4 个答案:

答案 0 :(得分:0)

这仅适用于2D阵列。不是我编写的最优雅的代码,但它有效...

    foreach($Fields as $key=>$var) {
        ksort($var);
        $Fields[$key]=$var;
    }
    ksort($Fields);

答案 1 :(得分:0)

让我给出一个真实的数据示例,而不是假数据,因为假数据几乎让我感到困惑。因此,假数据被评论。

/*
$Fields['User']['ID'] = "User ID";
$Fields['User']['FirstName'] = "First Name";
$Fields['Stats']['FavouriteOrder'] = "Favourite Item Ordered";
$Fields['Geographic']['Location'] = "Current Location";
$Fields['Geographic']['LocationCode'] = "Current Location Code";
*/

$Fields['Product']['ReferenceNumber'] = "Product Reference Number";
$Fields['Product']['Halaal'] = "Halaal Status";
$Fields['Product']['Kosher'] = "Kosher Status";
$Fields['Product']['KosherType'] = "Kosher Type";
$Fields['Product']['CuringSalts'] = "Curing Salts Status";
$Fields['Product']['ProductVisibility'] = "Product Visibility";
$Fields['Product']['ProductStatus'] = "Product Status";
$Fields['Product']['PackBarCode'] = "Barcode";
$Fields['Product']['ProductDescription'] = "Product Description";
$Fields['Pack']['PackSize'] = "Pack Size";
$Fields['Pack']['PackSizeNumeric'] = "Numeric Pack Size";
$Fields['Allergens']['ContainsNuts'] = "Product Contains Nuts";


foreach ($Fields as $key => $value) {
    ksort($value);
    $Fields[$key] = $value;
}
ksort($Fields);

我有一个'那些'星期五... print_r($ Fields)显示键正在被排序并且值被关联,但它仍然按键而不是结束值排序。

这几乎就像我需要一个反向排序系统,它首先检查所有值,对它们进行排序,然后说'好吧你属于哪个......啊,你属于表Y中的FieldX'

我希望有一个偷偷摸摸的聪明方法来做,也许有,但我想我会编写一个函数来解析数据,写一个反向数组,然后重新编写原始值的顺序。在战斗上效率低下,但它会做到。

虽然仍然可以提供更好的建议!

答案 2 :(得分:0)

好吧,它根本不优雅。所以我不鼓励使用它,并寻找更好的方法。但是我的解决方案是上面和下面的例子。

不幸的是,我希望它的方式,数组HAS包含一个前面的“排序”号码,所以,我想从一开始我就失败了。但它现在有效。

$TempDescArray = array();
$TempFieldArray = array();
$TempTableArray = array();
$Pointer = 0;

foreach ($Fields as $Table => $FieldsArray) {   
    foreach ($FieldsArray as $Field => $Description) {
        $TempDescArray[$Pointer] = $Description;
        $TempFieldArray[$Pointer] = $Field;
        $TempTableArray[$Pointer] = $Table;
        $Pointer++;
    }
}

asort($TempDescArray);
$Fields = array();
$Pointer2 = 0;

foreach ($TempDescArray as $Pointer => $Description) {
    $Fields[$Pointer2][$TempTableArray[$Pointer]][$TempFieldArray[$Pointer]] = $Description;
    $Pointer2++;
}

答案 3 :(得分:0)

我昨天必须为我正在进行的项目工作 - 这是我的代码:

资源数组如下所示:

$resource[$count]['title']
$resource[$count]['filepath']
$resource[$count]['filename']
$resource[$count]['taxonomy'][0]

按标题ASC或DESC

排序的几个排序函数
function compare_asc($a, $b) {
    return strcmp($a['title'], $b['title']);
}
function compare_desc($a, $b) {
    if ($a['title'] == $b['title']) {
        return 0;
    }
    return ($a['title'] > $b['title']) ? -1 : 1;
    //return strcmp($a['title'], $b['title']);
}

最后使用usort来执行脏操作,然后循环遍历$ resource并输出您需要的任何内容。

usort($resource, "compare_asc");