Вопрос по arrays, php, multidimensional-array – Используйте array_multisort () с пользовательской функцией

1

У меня есть следующий массив, и я хотел бы отсортировать его по другому массиву, а неDESC или жеASC

$array = array(
    'note' => array('test', 'test1', 'test2', 'test3', 'test4'),
    'year' => array('2011','2010', '2012', '2009', '2010'),
    'type' => array('journal', 'conference', 'conference', 'conference','conference'),
);

Можно ли сделать это с помощью пользовательской функции внутри array_multisort ()?

Например:

array_multisort($array['type'], $array['year'], custom_function, $array['note']);

вместо:

array_multisort($array['type'], $array['year'], SORT_ASC, $array['note']);

Ваш Ответ

2   ответа
2

Если вы знаете глубину массива, вы можете просто применитьusort на каждом элементе массива для сортировки.

Вот пример, который упорядочивает в соответствии с пользовательским массивом:

<?php
$order = array(
    'first',
    'second',
    'third',
    'fourth',
    'fifth'
);

$array = array(
    array(
        'second',
        'fourth',
        'first',
        'third'
    ),
    array(
        'second',
        'first'
    )
);

foreach($array as &$value) {
    usort($value, function($a, $b) use($order) {
        return array_search($a, $order) > array_search($b, $order);
    });
}
unset($value);

var_dump($array);
/*
array(2) {
  [0]=>
  array(4) {
    [0]=>
    string(5) "first"
    [1]=>
    string(6) "second"
    [2]=>
    string(5) "third"
    [3]=>
    string(6) "fourth"
  }
  [1]=>
  array(2) {
    [0]=>
    string(5) "first"
    [1]=>
    string(6) "second"
  }
}
*/

Если вы не знаете, как далеко может зайти массив, единственное решение, которое приходит мне в голову, - это рекурсивная функция:

<?php
$order = array(
    'first',
    'second',
    'third',
    'fourth',
    'fifth'
);

$array = array(
    array(
        'second',
        'fourth',
        'first',
        'third'
    ),
    array(
        array('second', 'first'),
        array('fourth', 'third')
    )
);

function custom_multisort($array, $order) {
    foreach($array as &$value) {
        if(is_array($value[0])) {
            $value = custom_multisort($value, $order);
        } else {
            usort($value, function($a, $b) use($order) {
                return array_search($a, $order) > array_search($b, $order);
            });
        }
    }
    return $array;
}

$array = custom_multisort($array, $order);

var_dump($array);
/*
array(2) {
  [0]=>
  array(4) {
    [0]=>
    string(5) "first"
    [1]=>
    string(6) "second"
    [2]=>
    string(5) "third"
    [3]=>
    string(6) "fourth"
  }
  [1]=>
  array(2) {
    [0]=>
    array(2) {
      [0]=>
      string(5) "first"
      [1]=>
      string(6) "second"
    }
    [1]=>
    array(2) {
      [0]=>
      string(5) "third"
      [1]=>
      string(6) "fourth"
    }
  }
}
*/
-4

Я думаю, что это невозможно. Вместо этого делай так

$custom_function_value = custom_function();
array_multisort($array['type'], $array['year'], $custom_function_value, $array['note']);

Я думаю, что это даст желаемый результат.

Error: User Rate Limit Exceeded glarkou

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