Как изменить порядок массива? - PullRequest
5 голосов
/ 01 февраля 2010
$a = array(0=>'a',1=>'b',2=>'c', 3=>'d');

Я хочу изменить порядок на 3,2,0,1

$a = array(3=>'d',2=>'c',0=>'a', 1=>'b');

Ответы [ 6 ]

17 голосов
/ 01 февраля 2010

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

  • uasort() - сортировка массива с помощью пользовательской функции сравнения и поддержание связи индекса
  • uksort() - сортировка массива по ключам с помощью пользовательской функции сравнения
  • usort() - Сортировать массив по значениям с помощью пользовательской функции сравнения

Основываясь на примере Yannicks ниже, вы можете сделать это следующим образом:

$a = array(0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd');
$b = array(3, 2, 0, 1); // rule indicating new key order
$c = array();
foreach($b as $index) {
    $c[$index] = $a[$index];
}
print_r($c);

даст

Array([3] => d [2] => c [0] => a [1] => b)

Но, как я уже сказал в комментариях, если вы не сообщите нам правило, по которому следует упорядочивать массив, или более точно определите ваши потребности, мы не сможем вам помочь.

7 голосов
/ 01 февраля 2010

Поскольку массивы в PHP на самом деле являются упорядоченными картами, я не уверен, сохраняется ли порядок элементов при перечислении.

Если вы просто хотите перечислить их в определенном порядке:

$a = array(0=>'a',1=>'b',2=>'c', 3=>'d');
$order = array(3, 2, 0, 1);

foreach ($order as $index)
{
  echo "$index => " . $a[$index] . "\n";
}
6 голосов
/ 25 декабря 2012
function reorder_array(&$array, $new_order) {
  $inverted = array_flip($new_order);
  uksort($array, function($a, $b) use ($inverted) {
    return $inverted[$a] > $inverted[$b];
  });
}

$a = array(0=>'a',1=>'b',2=>'c', 3=>'d');
reorder_array($a, array(3, 2, 0, 1));

var_dump($a);

Результат:

Array ( [3] => d [2] => c [0] => a [1] => b )
0 голосов
/ 15 марта 2019

Более общий подход:

$ex_count = count($ex_names_rev_order);
$j = 0;
$ex_good_order = array();
for ($i=($ex_count - 1); $i >= 0 ; $i--) { 

    $ex_good_order[$j] = $ex_names_rev_order[$i];
    $j++;
}
0 голосов
/ 01 июня 2016

Самый простой способ сделать это с помощью uksort(), более функциональный способ:

$a = ['a','b','c','d'];
$order = [3, 2, 0, 1];

uksort($a, function($x, $y) use ($order) {
    return array_search($x, $order) > array_search($y, $order);
});

print_r($a); // [3 → d, 2 → c, 0 → a, 1 → b]
0 голосов
/ 01 февраля 2010

вот как

krsort($a);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...