2010-04-23 163 views
0

我正在用一组数据库字段构建一个数组,其中包含有关表,实际字段名称和描述性字段名称的信息作为多维数组。下面是它目前的样子:PHP中的多维数组值排序

$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()真的一样。

+0

你在哪里存储结构中的值? – 2010-04-23 15:28:06

+0

这些值是引号中的项目...我基本上将描述与特定表中的特定字段相关联。 – David 2010-04-23 15:30:55

+0

对不起,我被字段名称和值混淆了,你能发表一个你预期的最终输出的例子吗? – 2010-04-23 15:34:06

回答

0

这仅适用于2D阵列。没有代码的最优雅的一块,我已经写了,但它的作品...

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

嗯马诺斯,我试过你的建议,看到我即将发表的文章:) – David 2010-04-23 15:14:56

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($域)的一个

表明,键进行排序和价值有关,但它仍然通过按键,而不是最终值排序。

这几乎就像我需要一个反向排序系统,该系统首先会检查所有值,将它们排序,然后说,“好吧,你在哪里属于......啊,你属于FieldX表Y”

我希望有是一种偷偷摸摸的聪明的方式来做到这一点,也许有,但我想我会写一个函数来解析数据,写一个反转的数组,然后按照价值顺序重写原始。低效率,但它会。

尽管如此,仍然有更好的建议!

0

好吧,它根本不算优雅。所以我不鼓励使用它,并会寻找更好的方式。但是,我已经得到了解决上述和下面的例子的解决方案。

不幸的是,我希望它的方式是,数组必须包含前面的“排序”数字,所以我认为这是我一开始就失败的。但它现在起作用了。

$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++; 
} 
0

我真的要工作了这一点,昨天的一个项目我工作 - 这里是我的代码:

资源阵列看起来像这样:

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

一对夫妇的排序功能按标题排序ASC or 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在你做厕所之前做脏通过$资源并输出任何你需要的东西。

usort($resource, "compare_asc");