2013-05-06 56 views
0

我的数组是这样的:排序数组(多维数组)

Array 
    (
    [0] => Array 
    (
     [id] => 613 
     [kleur] => royalblauw/wit 
     [maat] => maat XL 
     [voorraad] => 100 
     [sort] => 0 
     [prijs] => 4.1320 
    ) 

[1] => Array 
    (
     [id] => 614 
     [kleur] => royalblauw/wit 
     [maat] => maat XXL 
     [voorraad] => 100 
     [sort] => 1 
     [prijs] => 4.1320 
    ) 

[2] => Array 
    (
     [id] => 620 
     [kleur] => zwart/wit 
     [maat] => maat XL 
     [voorraad] => 100 
     [sort] => 2 
     [prijs] => 4.1320 
    ) 
     etc.etc. 

我想是到“MAAT”(大小)数组排序。正如你所看到的,有多个条目具有相同的'maat'。

我一直在尝试几个小时,但仍然不是一个好的结果。当然我也一直在看Stackoverflow。这是我迄今为止所拥有的。

功能:

function cmp($a, $b) 
{ 

$sizes = array(
"116" => 0, 
"128" => 1, 
"140" => 2, 
"152" => 3, 
"164" => 4, 
"XXS" => 5, 
"XS" => 6, 
"S" => 7, 
"M" => 8, 
"L" => 9, 
"XL" => 10, 
"XXL" => 11, 
"XXXL" => 12, 
"XXXXL" => 13, 
"XXXXXL" => 14 
); 

$asize = $sizes[$a]; 
$bsize = $sizes[$b]; 

if ($asize == $bsize) { 
    return 0; 
} 

return ($asize > $bsize) ? 1 : -1; 

} 
function aasort (&$array, $key) { 
    $sorter=array(); 
    $ret=array(); 
    reset($array); 
    foreach ($array as $ii => $va) { 
     $sorter[$ii]=$va[$key]; 
    } 
    uasort($sorter, "cmp"); 
    foreach ($sorter as $ii => $va) { 
     $ret[$ii]=$array[$ii]; 
    } 
    $array=$ret; 
} 

并调用函数aasort:

aasort($maatkleur_array,"maat"); 

请你能帮助我。我希望这是我想要达到的目标。

+1

你有没有注意到一些错误信息?因为你的数组像'[“maat”] =“maat XL”,但你的'$ sizes'就像'[“XL”] = 10',而不是'[“maat XL”] = 10'。 – Passerby 2013-05-06 10:39:45

+0

嗯我会改变它,我没有得到一个错误顺便说一句,但排序不工作,它应该是 – Gijsve 2013-05-06 11:16:45

回答

2
进行排序

你想排序一个数组的数组。父数组没有(已命名)键。 uasort坚持你不想在你的情况下的关键所以使用usort代替:

error_reporting(E_ALL); 
ini_set('display_errors','on'); 

function cmp($a, $b) 
{ 

    $sizes = array('s'=>0,'m'=>'1','l'=>2,'xl'=>3); 

    if ($sizes[$a['maat']] == $sizes[$b['maat']]) { 
     return 0; 
    } 
    return ($sizes[$a['maat']] < $sizes[$b['maat']]) ? -1 : 1; 
} 



$input = array(
array('id'=>1,'kleur'=>'blauw','maat'=>'xl'), 
array('id'=>2,'kleur'=>'blauw','maat'=>'m'), 
array('id'=>1,'kleur'=>'blauw','maat'=>'s'), 
array('id'=>2,'kleur'=>'blauw','maat'=>'m'), 
array('id'=>3,'kleur'=>'blauw','maat'=>'l') 
); 

usort($input, "cmp"); 

print_r($input); 
+0

谢谢这是一个很好的答案 – Gijsve 2013-05-06 12:13:26

1

我已经改变了您的CMP功能几乎达到你什么除外..

$sort = array(); 
// $arrayData is your main array 
foreach($arrayData as $key => $value) 
{ 
    $sort[$key] = cmp(strtoupper(str_replace('maat ', '', $value['maat']))); 
} 

array_multisort($sort, SORT_ASC, $arrayData); 

function cmp($a) 
{ 

$sizes = array(
"116" => 0, 
"128" => 1, 
"140" => 2, 
"152" => 3, 
"164" => 4, 
"XXS" => 5, 
"XS" => 6, 
"S" => 7, 
"M" => 8, 
"L" => 9, 
"XL" => 10, 
"XXL" => 11, 
"XXXL" => 12, 
"XXXXL" => 13, 
"XXXXXL" => 14 
); 


return $sizes[$a]; 

} 

排序是根据CMP函数的返回值。 $ arrayData将根据maat大小排序数组。

-1

编辑:

改为使用此回调。这将这样的伎俩:

<?php 
function usort_callback($a, $b) { 
     $sizes = array(
      "116" => 0, 
      "128" => 1, 
      "140" => 2, 
      "152" => 3, 
      "164" => 4, 
      "XXS" => 5, 
      "XS" => 6, 
      "S" => 7, 
      "M" => 8, 
      "L" => 9, 
      "XL" => 10, 
      "XXL" => 11, 
      "XXXL" => 12, 
      "XXXXL" => 13, 
      "XXXXXL" => 14 
     ); 

     $value1 = $sizes[trim(str_replace('maat', '', $a['maat']))]; 
     $value2 = $sizes[trim(str_replace('maat', '', $b['maat']))]; 

     return ($value1 < $value2) ? -1 : 1; 
    } 
?> 

原贴:

usort()试试:

<?php 
    function usort_callback($a, $b) { 
     return strcmp($a['maat'], $b['maat']); 
    } 

    usort($array, "usort_callback"); 
?> 

现在你的阵列应该由关键 “MAAT”

+0

但主要是它不应该排序在字母表上,我的意思是例如S应该高于L(小和大)。 – Gijsve 2013-05-06 11:29:28

+0

请注意我的编辑帖子 – Traur 2013-05-06 12:15:42