2014-01-08 119 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

这给出了排序的$尺寸,但不会追加缺少的元素到最后。 –

相关问题