如何通过子字符串对数组进行排序?(¨PHP)
如何通过子字符串对数组进行排序?(¨PHP)
我已经创建了一个用于排序数组的方法,数组的值如下: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未定义,所以这不是一个解决方案。
问题是如何正确实现这个函数?
如何通过子字符串对数组进行排序?(PHP)
第一个解决方案是针对我的原始问题:
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);
以上是如何通过子字符串对数组进行排序的解决方法。
问题:如何按子字符串对数组进行排序?
原因:该问题的出现是因为在PHP中,对数组按子字符串进行排序需要通过回调函数来实现,而不是直接调用排序函数。
解决方法:解决这个问题的方法是使用usort()函数,并将回调函数以数组的形式传递给它。具体代码如下:
usort($date_cols, [$this, 'sortColumnsBySubstring']);
上述代码中,$date_cols是需要排序的数组,[$this, 'sortColumnsBySubstring']是回调函数的数组形式表示。通过这种方式,可以按照指定的子字符串对数组进行排序。
另外,如果想了解更多关于回调函数的使用方法,可以参考PHP文档中的Callbacks / Callables部分。