【问题标题】:How to sort array by substring? (¨PHP)如何按子字符串对数组进行排序? (¨PHP)
【发布时间】:2016-05-25 10:54:02
【问题描述】:

我已经创建了使用如下值对数组进行排序的方法: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 手册中找到的示例显示了没有参数或闭包的函数 - 我使用 php 版本 5.2,所以我不能使用闭包。

我能想到的就是这个usort($date_cols, $this->sortColumnsBySubstring($value, 'date'),但这里 $value 是未定义的,所以它不是解决方案。

问题是如何实现该功能才能正常工作?

【问题讨论】:

标签: php usort


【解决方案1】:

您需要将回调作为数组传递:

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

请参阅 PHP 文档中的 Callbacks / Callables

【讨论】:

    【解决方案2】:

    第一个解决方案是我原来的问题:

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

    【讨论】:

      猜你喜欢
      • 2012-10-14
      • 2014-01-05
      • 2011-03-10
      • 2020-02-07
      • 2017-07-13
      • 1970-01-01
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多