2017-05-03 59 views
1

当然,我可以排序数组sort(),消除重复array_unique()并消除空白array_filter()。我可以用三行来做到这一点,然后为我必须处理的十个数组重复这三行。优雅的方法来排序,使唯一和消除重复数组

但是我希望它至少略显优雅,所以我试着结合这三个操作。它的工作前两个,然后我把它太远,应用排序()

$testArray = sort(array_filter(array_unique($testArray))); 

这产生:

严格的标准:只有变量应该按引用传递

那么完成这个数组处理目标的最优雅的方法是什么?

帮助我理解失败原因的积分。

+1

创建一个函数,调用这三个函数,并在你需要的所有数组上调用你的函数? –

+0

@JanHančič - 是的,可以工作,我想这似乎是一件了不起的事情,必须做这么简单的事情?我半想知道是否已经有一个内置函数来做到这一点? – mayersdesign

+2

排序功能通过参考'布尔排序(阵列&$阵列[摘要$ sort_flags改变= SORT_REGULAR])'取阵列,所以这就是为什么它不严格模式下工作。问题是为什么你首先有这么多不同的阵列,这似乎是一个设计问题。 – xander

回答

1

就像一个概念的证明你可以避免创建中间变量和变异原始数组。请从Standard PHP Library (SPL)查看SplMinHeap。您可以使用此类进行不可变排序:

$testArray = iterator_to_array(array_reduce(
    array_filter(array_unique($testArray)), 
    function ($heap, $element) { 
     $heap->insert($element); 
     return $heap; 
    }, 
    new SplMinHeap 
)); 

这里是working demo

+0

不仅仅是概念证明,它还是一个完美的功能,并且解决了我的问题,无论如何都只是针对内部代码,非常感谢!超级有趣的方法呢! – mayersdesign

1

您的代码$testArray = sort(array_filter(array_unique($testArray)));并不如你预期由于sort()功能的滥用工作:

  1. sort()返回值是TRUEFALSE。不是你期望的数组。
  2. sort() recived数组参数的元素将排列在数组本身上。所以它需要一个真正的数组来处理它;而不是其他函数的复活值,它并不真正作为变量存在。这是错误

    只有变量应该通过引用传递的原因...

知道了,并铭记在PHP the value of an assignment expression is the value assigned. That is, the value of "$a = 3" is 3。修复错误的第一种方法可能是:

sort($testArray = array_filter(array_unique($testArray))); 

...但它也不起作用。赋值返回$ testArray的值,而不是$ testArray本身。和以前一样的问题。

此时,解决此问题的最简单方法没有不必要的开销:使用两行代码而不是一行代码。

$testArray = array_filter(array_unique($testArray)); 
sort($testArray); 

测试它here

+0

非常好的信息,非常感谢! – mayersdesign