2016-05-25 52 views
0

我已經建立的方法來與這樣的值進行排序數組:array('regdate','birthday','editdate')應的方式中的元素,包含字日期的元素應該被移動到左這樣array('regdate','editdate','birthday')如何按子串排序數組? (PHP)

public function sortColumnsBySubstring($haystack, $substr){ 
    if ($haystack == $substr) { 
      return 0; 
     } 
    return strpos($substr) !== false ? -1 : 1; 
} 

排序然而,它我不清楚如何使這個工作。我在php手冊中找到的示例顯示沒有參數或閉包的函數 - 我使用PHP 5.2版,因此我無法使用閉包。

所有我能想到的是這個usort($date_cols, $this->sortColumnsBySubstring($value, 'date')但這裏$ value是未定義的,所以它不是解決方案。

問題是如何實現功能正常工作?

+0

也許,[這](http://stackoverflow.com/questions/8230538/pass-extra-parameters-to-usort-callback)可能幫你。 – Muriano

+0

[如何傳遞usort()參數?](http://stackoverflow.com/questions/29823045/how-to-pass-usort-a-parameter) – Muriano

+0

https://3v4l.org/eVP1P檢查這 – Ali

回答

0

第一種方法是我原來的問題:

function cmp($a, $b) 
{ 
    $adate = (strpos($a, 'date') !== false); 
    $bdate = (strpos($b, 'date') !== false); 
    if (!($adate^$bdate)) return strcmp($a, $b); 
    return $adate ? -1 : 1; 
} 

$a = array('birthday', 'regdate', 'editdate'); 
usort($a, 'cmp'); 

其次解決方案採用拆分成兩個陣列,進行排序,然後將它們合併回來。我試圖用更多與時間相關的詞來確定與時間相關的值。

private function getDateColumns(&$array) 
{ 
$search_date_columns = array('date','datetime','timestamp','time','edited','changed','modified','created','datum'); 
$result = array(array(), array()); 
foreach($array as $v1): 
    $found = false; 
    foreach($search_date_columns as $v2) 
    if (strpos($v1, $v2)!==false) 
     { $found = true; break; } 
    if ($found) 
    $result[0][] = $v1; 
    else 
    $result[1][] = $v1; 
endforeach; 
return $result; 
} 

這是實現這樣的:

$date_cols = array('regdate','time','editdate','createdate','personal','mojedatum','edited','test','modified','changed','pokus','timestamp','hlava'); 
$arrays = $this->getDateColumns($date_cols); 
rsort($arrays[0]); 
$date_cols = array_merge($arrays[0], $arrays[1]); 
unset($arrays); 
print_r($date_cols);