Как я Сортирую Многомерный массив в PHP [дубликат]

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

198
задан hakre 29 October 2013 в 22:39
поделиться

6 ответов

Можно использовать 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);
213
ответ дан AbraCadaver 23 November 2019 в 05:10
поделиться

С usort. Вот универсальное решение, которое можно использовать для различных столбцов:

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);
32
ответ дан troelskn 23 November 2019 в 05:10
поделиться

Функция "Usort" является Вашим ответом.
http://php.net/usort

2
ответ дан Jan Hančič 23 November 2019 в 05:10
поделиться

Вот php4/php5 класс, который отсортирует одно или несколько полей:

// a sorter class
//  php4 and php5 compatible
class Sorter {

  var $sort_fields;
  var $backwards = false;
  var $numeric = false;

  function sort() {
    $args = func_get_args();
    $array = $args[0];
    if (!$array) return array();
    $this->sort_fields = array_slice($args, 1);
    if (!$this->sort_fields) return $array();

    if ($this->numeric) {
      usort($array, array($this, 'numericCompare'));
    } else {
      usort($array, array($this, 'stringCompare'));
    }
    return $array;
  }

  function numericCompare($a, $b) {
    foreach($this->sort_fields as $sort_field) {
      if ($a[$sort_field] == $b[$sort_field]) {
        continue;
      }
      return ($a[$sort_field] < $b[$sort_field]) ? ($this->backwards ? 1 : -1) : ($this->backwards ? -1 : 1);
    }
    return 0;
  }

  function stringCompare($a, $b) {
    foreach($this->sort_fields as $sort_field) {
      $cmp_result = strcasecmp($a[$sort_field], $b[$sort_field]);
      if ($cmp_result == 0) continue;

      return ($this->backwards ? -$cmp_result : $cmp_result);
    }
    return 0;
  }
}

/////////////////////
// usage examples

// some starting data
$start_data = array(
  array('first_name' => 'John', 'last_name' => 'Smith', 'age' => 10),
  array('first_name' => 'Joe', 'last_name' => 'Smith', 'age' => 11),
  array('first_name' => 'Jake', 'last_name' => 'Xample', 'age' => 9),
);

// sort by last_name, then first_name
$sorter = new Sorter();
print_r($sorter->sort($start_data, 'last_name', 'first_name'));

// sort by first_name, then last_name
$sorter = new Sorter();
print_r($sorter->sort($start_data, 'first_name', 'last_name'));

// sort by last_name, then first_name (backwards)
$sorter = new Sorter();
$sorter->backwards = true;
print_r($sorter->sort($start_data, 'last_name', 'first_name'));

// sort numerically by age
$sorter = new Sorter();
$sorter->numeric = true;
print_r($sorter->sort($start_data, 'age'));
2
ответ дан Devon 23 November 2019 в 05:10
поделиться

Прежде чем я мог заставить класс 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 - то, как Вы хотите выполненный вид, такой как $has_header SORT_DESC
  • имеет значение true, если первая строка содержит значения заголовка, которые Вы не хотите отсортированный.
0
ответ дан Community 23 November 2019 в 05:10
поделиться

Я предпочитаю использовать array_multisort. См. документацию здесь .

-2
ответ дан Krease 23 November 2019 в 05:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: