2014-01-08 170 views
0

我如何排序基於另一個數組的數組? 我說的是價值觀,而不是關鍵。我發現很多關於如何對鍵進行排序的問題,但沒有涉及到這些值。排序PHP數組的值進行比較,另一個數組

可以想象我有此數組:

$sizes = array("L", "XXXL", "M", "S"); 

我怎樣可以重新排列這些是這樣的:

$newsizes = array("S", "M", "L", "XXXL"); 

基於這樣一個固定的人的邏輯陣列上:

$sizeincrement = array("XS", "S", "M", "L", "XL", "XXL", "XXXL"); 

並且考慮到不在sizeincrement數組中的元素應該添加到最後。

我認爲這將存在一個現成的排序功能,但它似乎也並非如此:PHP SORTING

+0

array_intersect()會做你需要在不訴諸自定義函數或usort排序。參見[我的回答(http://stackoverflow.com/questions/21004179/sort-php-array-by-value-compared-to-another-array/21004431#21004431)。 –

+0

@DigitalChris雖然交叉,差異,然後合併數組是真正比usort更有效的方法,這是值得商榷的。 =) – jszobody

+0

@jszobody不,我想你錯過了這一點。我也回答了他的第二部分:「末尾沒有添加大小遞增列表中的元素。」單線array_intersect完成了其他答案。 –

回答

1

使用共同的陣列功能,能做到這一點:

<?php 
$sizes = array("L", "XXXL", "M", "S"); 

$sizeincrement = array("XS", "S", "M", "L", "XL", "XXL", "XXXL"); 

//this will give you the array you need in the order you need: 
$sorted_array = array_intersect($sizeincrement,$sizes); 

//now get the ones NOT in the array: 

$missing_array = array_diff($sizeincrement,$sizes); 

$final_array = array_merge($sorted_array, $missing_array); 

var_dump($final_array); 
?> 

這是工作:https://eval.in/87279

+0

謝謝克里斯,這是考慮我的問題最後部分的解決方案 –

1

你可以用自定義usort回調函數做到這一點很容易地。事情是這樣的:

function compare($a, $b) { 
    $sizeincrement = array("XS", "S", "M", "L", "XL", "XXL", "XXXL"); 
    if(!array_search($a, $sizeincrement)) return 1; 
    if(!array_search($b, $sizeincrement)) return -1; 
    return array_search($a, $sizeincrement) > array_search($b, $sizeincrement); 
} 

然後調用:

usort($sizes, "compare"); 

工作例如:http://3v4l.org/2Hp0g

+0

你忘了不添加那些在最後的初始陣列中添附的不追加http://3v4l.org/C2LtC。 –

+0

它們會自動前置http://3v4l.org/C2LtC –

+0

@VincentDuprez沒有看他的輸出:它只有4個元素。 –

1

自定義功能,可真的很快做的工作!這是我的客人

$sizes = array("L", "XXXL", "M", "S"); 

function sort_size($arr) { 
    $out = array(); 

    foreach (array("XS", "S", "M", "L", "XL", "XXL", "XXXL") as $size) { 
     if (in_array($size, $arr)) { 
      $out[] = $size; 
     } 
    } 

    return $out; 
} 

$newSizes = sort_size($sizes); 

就像你可以直接在數組中添加或刪除新的尺寸在foreach中。

希望幫助!

+0

我認爲你的答案缺少一些不存在於參考數組中的值的情況,它們將會丟失。我可能是錯的 –

+0

這給出了排序的$尺寸,但不會追加缺少的元素到最後。 –

相關問題