2013-05-06 108 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