如何通过子字符串对数组排序?(¨PHP)[重复]

k3bvogb1  于 2023-04-28  发布在  PHP
关注(0)|答案(2)|浏览(97)

此问题已在此处有答案

How do I use a class method as a callback function?(5个答案)
pass a callback WITH arguments in PHP(3个答案)
5天前关闭。
我创建了一个方法来对数组进行排序,其中的值如下所示:array('regdate','birthday','editdate'),它应该按照包含word 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是未定义的,所以它不是解。
问题是如何实现功能才能正确工作?

taor4pac

taor4pac1#

你需要将回调函数作为一个数组传递:

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

参见PHP文档中的Callbacks / Callables

xdnvmnnf

xdnvmnnf2#

第一个答案是我最初的问题:

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

相关问题