2017-05-03 30 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