сортировка 2d-массива с индивидуальным компаратором с использованием phps array_multisort

Я получил 2d-массив, содержащий «столбец», по которому весь этот массив должен быть отсортирован. Как я узнал здесь, использовать array_multisort довольно просто. Моя проблема в том, что этот столбец для сортировки содержит значения, которые нужно сравнивать необычным образом. Поэтому я подумал о чем-то вроде этого:

function main(){
    $toBeSorted = array(array(...), ..., array(...));
    $sortColumnIndex = n;
    $sort_column = array();

    //Code copied from provided link
    foreach ($toBeSorted as $row)
        $sort_column []= $row[$sortColumnIndex];

    array_multisort($this->comparator(),$sort_column, $toBeSorted);
}

function comparator(a,b){
    return 1;
}

Как видите, я хочу передать свой компаратор этой функции сортировки. Я, вероятно, много думаю не о php.


person Milla Well    schedule 06.09.2012    source источник


Ответы (2)


Существует функция usort, которая выполняет сортировку с использованием обратного вызова.

В противном случае вы можете взглянуть на array_walk и array_walk_recursive, которые перебирают массив и применяют функцию к каждому член.

person lortabac    schedule 06.09.2012
comment
есть ли другая функция, которая работает как usort, но возвращает массив позиций элементов? Прямо как питоны numpy.argsort? Потому что иначе я не могу отслеживать другие столбцы для сортировки 2d-массивов? - person Milla Well; 06.09.2012
comment
Я не думаю, что он существует. Это список всех функций сортировки массивов в PHP. - person lortabac; 06.09.2012

Я решил это, преобразовав свое пространство сортировки в одно, которое может обрабатывать array_multisort:

...

$sortColumn = array();
foreach($toBeSorted as $value){
     $sortColumn[] = $this->transform($value);
}
array_multisort($sortColumn, $toBeSorted);

...

моя функция преобразования просто делает все, что, как я представлял, будет делать обратный вызов.

function transform($value){
    //i.e. return real part of complex number
    //or parse strings or any kind of strange datatypes
}
person Milla Well    schedule 07.09.2012