我将CSV数据加载到多维数组中。这样,每个“行”就是一条记录,每个“列”包含相同类型的数据。我正在使用下面的函数来加载我的CSV文件。

function f_parse_csv($file, $longest, $delimiter)
{
  $mdarray = array();
  $file    = fopen($file, "r");
  while ($line = fgetcsv($file, $longest, $delimiter))
  {
    array_push($mdarray, $line);
  }
  fclose($file);
  return $mdarray;
}

我需要能够指定一个列来排序,以便它重新排列行。其中一列包含Y-m-d H:i:s格式的日期信息,我希望能够以最近的日期作为第一行进行排序。


当前回答

你可以使用array_multisort()

试试这样做:

foreach ($mdarray as $key => $row) {
    // replace 0 with the field's index/key
    $dates[$key]  = $row[0];
}

array_multisort($dates, SORT_DESC, $mdarray);

对于PHP >= 5.5.0,只需提取要排序的列。不需要循环:

array_multisort(array_column($mdarray, 0), SORT_DESC, $mdarray);

其他回答

你可以使用array_multisort()

试试这样做:

foreach ($mdarray as $key => $row) {
    // replace 0 with the field's index/key
    $dates[$key]  = $row[0];
}

array_multisort($dates, SORT_DESC, $mdarray);

对于PHP >= 5.5.0,只需提取要排序的列。不需要循环:

array_multisort(array_column($mdarray, 0), SORT_DESC, $mdarray);

我知道这个问题提出和回答已经有两年了,但这是另一个对二维数组排序的函数。它接受可变数量的参数,允许您传入多个键(即列名)进行排序。需要PHP 5.3。

function sort_multi_array ($array, $key)
{
  $keys = array();
  for ($i=1;$i<func_num_args();$i++) {
    $keys[$i-1] = func_get_arg($i);
  }

  // create a custom search function to pass to usort
  $func = function ($a, $b) use ($keys) {
    for ($i=0;$i<count($keys);$i++) {
      if ($a[$keys[$i]] != $b[$keys[$i]]) {
        return ($a[$keys[$i]] < $b[$keys[$i]]) ? -1 : 1;
      }
    }
    return 0;
  };

  usort($array, $func);

  return $array;
}

试试这里:http://www.exorithm.com/algorithm/view/sort_multi_array

我尝试了几个流行的array_multisort()和usort()答案,没有一个适合我。数据变得混乱,代码无法阅读。这里有一个快速而肮脏的解决方案。警告:只有当您确定不正常的分隔符以后不会回来困扰您时才使用此方法!

假设你的多数组中的每一行看起来像:name, stuff1, stuff2:

// Sort by name, pull the other stuff along for the ride
foreach ($names_stuff as $name_stuff) {
    // To sort by stuff1, that would be first in the contatenation
    $sorted_names[] = $name_stuff[0] .','. name_stuff[1] .','. $name_stuff[2];
}
sort($sorted_names, SORT_STRING);

要把你的东西按字母顺序放回去吗?

foreach ($sorted_names as $sorted_name) {
    $name_stuff = explode(',',$sorted_name);
    // use your $name_stuff[0] 
    // use your $name_stuff[1] 
    // ... 
}

是的,它很脏。但是超级简单,不会让你脑袋爆炸。

的作用。这里有一个通用的解决方案,你可以使用不同的列:

class TableSorter {
  protected $column;
  function __construct($column) {
    $this->column = $column;
  }
  function sort($table) {
    usort($table, array($this, 'compare'));
    return $table;
  }
  function compare($a, $b) {
    if ($a[$this->column] == $b[$this->column]) {
      return 0;
    }
    return ($a[$this->column] < $b[$this->column]) ? -1 : 1;
  }
}

按第一列排序:

$sorter = new TableSorter(0); // sort by first column
$mdarray = $sorter->sort($mdarray);

“Usort”函数就是答案。 http://php.net/usort