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


当前回答

在运行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。

其他回答

在运行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。

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

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

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

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

使用闭包进行多行排序

下面是使用uasort()和匿名回调函数(闭包)的另一种方法。我经常使用这个函数。需要PHP 5.3 -没有更多的依赖!

/**
 * Sorting array of associative arrays - multiple row sorting using a closure.
 * See also: http://the-art-of-web.com/php/sortarray/
 *
 * @param array $data input-array
 * @param string|array $fields array-keys
 * @license Public Domain
 * @return array
 */
function sortArray( $data, $field ) {
    $field = (array) $field;
    uasort( $data, function($a, $b) use($field) {
        $retval = 0;
        foreach( $field as $fieldname ) {
            if( $retval == 0 ) $retval = strnatcmp( $a[$fieldname], $b[$fieldname] );
        }
        return $retval;
    } );
    return $data;
}

/* example */
$data = array(
    array( "firstname" => "Mary", "lastname" => "Johnson", "age" => 25 ),
    array( "firstname" => "Amanda", "lastname" => "Miller", "age" => 18 ),
    array( "firstname" => "James", "lastname" => "Brown", "age" => 31 ),
    array( "firstname" => "Patricia", "lastname" => "Williams", "age" => 7 ),
    array( "firstname" => "Michael", "lastname" => "Davis", "age" => 43 ),
    array( "firstname" => "Sarah", "lastname" => "Miller", "age" => 24 ),
    array( "firstname" => "Patrick", "lastname" => "Miller", "age" => 27 )
);

$data = sortArray( $data, 'age' );
$data = sortArray( $data, array( 'lastname', 'firstname' ) );