我将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格式的日期信息,我希望能够以最近的日期作为第一行进行排序。


当前回答

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

其他回答

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

在运行TableSorter类之前,我已经根据Shinhan提供的函数提出了一个函数。

function sort2d_bycolumn($array, $column, $method, $has_header)
  {
  if ($has_header)  $header = array_shift($array);
  foreach ($array as $key => $row) {
    $narray[$key]  = $row[$column]; 
    }
  array_multisort($narray, $method, $array);
  if ($has_header) array_unshift($array, $header);
  return $array;
  }

$array是你要排序的MD数组。 $column是您希望排序的列。 $method是你想要排序执行的方式,比如SORT_DESC 如果第一行包含您不想排序的标题值,则$has_header设置为true。

我尝试了几个流行的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] 
    // ... 
}

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

可以使用usort函数对数组进行排序。

 $array = array(
  array('price'=>'1000.50','product'=>'product 1'),
  array('price'=>'8800.50','product'=>'product 2'),
  array('price'=>'200.0','product'=>'product 3')
);

function cmp($a, $b) {
  return $a['price'] > $b['price'];
}
usort($array, "cmp");
print_r($array);

输出:

Array
(
    [0] => Array
        (
            [price] => 134.50
            [product] => product 1
        )

    [1] => Array
        (
            [price] => 2033.0
            [product] => product 3
        )

    [2] => Array
        (
            [price] => 8340.50
            [product] => product 2
        )

)

例子

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