Перестановка в массиве php

297
22 марта 2017, 18:56

Есть массив, всего 12 элементов

$sources    = [0,1,2,3,4,5,6,7,8,9,10,11];

Мне нужно переставить элементы как показано далее,

$collection = [
            $sources[0],
            $sources[3],
            $sources[6],
            $sources[9],
            $sources[1],
            $sources[4],
            $sources[7],
            $sources[10],
            $sources[2],
            $sources[5],
            $sources[8],
            $sources[11],
        ];

Какие могут быть варианты? Без такого велосипеда

Answer 1
$sources    = [0,1,2,3,4,5,6,7,8,9,10,11];
$dest = array_map(function($i) use ($sources){
    return $sources[3*($i%4)+intval($i/4)];
}, array_keys($sources));
echo json_encode($dest);
// [0,3,6,9,1,4,7,10,2,5,8,11]

Или, что то же самое

$sources    = [0,1,2,3,4,5,6,7,8,9,10,11];
$dest = [];
for($i = 0; $i < count($sources); $i++) {
  $dest[] = $sources[3*($i%4)+intval($i/4)];
}
echo json_encode($dest);
// [0,3,6,9,1,4,7,10,2,5,8,11]

Масштабируемый вариант:

$sources    = [
    0,1,2,3,4,5,
    6,7,8,9,'A','B'
];
$n = count($sources);
$sliceTo = 2;
$dest = array_map(function($i) use ($sources, $n, $sliceTo){
    return $sources[($n/$sliceTo)*($i%$sliceTo)+($i/$sliceTo)];
}, array_keys($sources));
echo json_encode($dest);
// [0,6,1,7,2,8,3,9,4,"A",5,"B"]
Answer 2

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

$sources    = [0,1,2,3,4,5,6,7,8,9,10,11];
$result = [];
$idx = 0;
foreach($sources as $k => $v){
    $idx = $k / 3  + $k % 3 * 4;
    $result[$idx] = $v;
}
ksort($result);

На месте автора для подобной разовой фиксированной перестановки элементов я бы завел простой массив новых индексов, и использовал бы его. Это, пожалуй, самый простой и наглядный способ.

$order = [0,3,6,9,1,4,7,10,2,5,8,11];
$result = [];
foreach($order as $oldIdx => $newIdx){
     $result[$newIdx] = $sources[$newIdx];
}

При чем этому циклу есть альтернатива в виде функции array_combine():

$sources  = [0,1,2,3,4,5,6,7,8,9,10,11];
$order    = [0,3,6,9,1,4,7,10,2,5,8,11];
$result   = array_combine($order, $sources);

еще одна из вариаций для фиксированного числа элементов без расчета соответствия старых и новых индексов:

$x = array_chunk($sources, 3);
$result = array_merge(
              array_column($x,0),
              array_column($x,1),
              array_column($x,2)
          );
READ ALSO
Где скачать libvlc + c++

Где скачать libvlc + c++

Здравствуйте, подскажите можно где скачать библиотеку плеера vlc для разработки под линукс?

273
Удаление элементов из массива

Удаление элементов из массива

Нужно удалить чётные элементы из массиваКак сделать так, чтобы элемент удалялся, а не просто вместо него был 0

358
перезадание переменной типа &ldquo;класс&rdquo;

перезадание переменной типа “класс”

Не совсем понимаю, как работать с классами в си

219
Компаратор для set [требует правки]

Компаратор для set [требует правки]

Подскажите пожалуйста как написать свой компаратор для setЭто будет использоваться в целях спортивного программирования

340