php multisort - Come ordinare una matrice multidimensionale in PHP




6 Answers

Puoi usare array_multisort()

Prova qualcosa del genere:

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

array_multisort($dates, SORT_DESC, $mdarray);

Per PHP> = 5.5.0 basta estrarre la colonna per ordinare. Non c'è bisogno del ciclo:

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

Questa domanda ha già una risposta qui:

Ho caricato i dati CSV in un array multidimensionale. In questo modo ogni "riga" è un record e ogni "colonna" contiene lo stesso tipo di dati. Sto usando la funzione qui sotto per caricare il mio file 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;
}

Devo essere in grado di specificare una colonna da ordinare in modo che riorganizzi le righe. Una delle colonne contiene informazioni sulla data nel formato di Ymd H:i:s e mi piacerebbe essere in grado di ordinare con la data più recente della prima riga.




Con usort . Ecco una soluzione generica che puoi utilizzare per colonne diverse:

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

Per ordinare per prima colonna:

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



So che sono passati 2 anni da quando è stata posta questa domanda e ho risposto, ma ecco un'altra funzione che ordina una matrice bidimensionale. Accetta un numero variabile di argomenti, consentendo di passare in più di una chiave (ad esempio il nome della colonna) per ordinare. PHP 5.3 richiesto.

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

Provalo qui: http://www.exorithm.com/algorithm/view/sort_multi_array







Prima che riuscissi a far funzionare la classe TableSorter mi era venuta in mente una funzione basata su ciò che aveva fornito.

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 è l'array MD che si desidera ordinare.
  • $ column è la colonna che desideri ordinare.
  • $ metodo è il modo in cui si desidera eseguire l'ordinamento, ad esempio SORT_DESC
  • $ has_header è impostato su true se la prima riga contiene valori di intestazione che non si desidera ordinare.



Preferisco usare array_multisort. Vedi la documentazione here .




Related

php sorting multidimensional-array