2016-05-25 2 views
0

Я создал метод для сортировки массива со значениями, как эти: array('regdate','birthday','editdate'), которые должны сортировать элементы таким образом, что элементы, содержащие дату слова должны быть перемещены влево, как этот array('regdate','editdate','birthday')Как отсортировать массив подстрокой? (РНР)

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

Однако это мне не ясно, как это сделать. Пример, который я нашел в php manual, показывает функцию без аргументов или замыканий - я использую версию php 5.2, поэтому я не могу использовать закрытие.

Все, что я могу придумать, это usort($date_cols, $this->sortColumnsBySubstring($value, 'date'), но здесь значение $ undefined, так что это не решение.

Вопрос в том, как реализовать функцию для правильной работы?

+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); 
2

Вы должны передать функцию обратного вызова в виде массива:

usort($date_cols, [$this, 'sortColumnsBySubstring']); 

См Callbacks/Callables в PHP документации.