我创建了一个方法,用这样的值对数组进行排序:array('regdate','birthday','editdate')
应该按照包含单词date的元素的方式对元素进行排序,如array('regdate','editdate','birthday')
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 :(得分:2)
您需要将回调作为数组传递:
usort($date_cols, [$this, 'sortColumnsBySubstring']);
请参阅PHP文档中的Callbacks / Callables。
答案 1 :(得分: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);