Есть массив, всего 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],
];
Какие могут быть варианты? Без такого велосипеда
$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"]
альтернативный вариант, для уже опубликованного ответа, для тех кто не знаком с функциями обработки массивов.
$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)
);
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Здравствуйте, подскажите можно где скачать библиотеку плеера vlc для разработки под линукс?
Нужно удалить чётные элементы из массиваКак сделать так, чтобы элемент удалялся, а не просто вместо него был 0
Подскажите пожалуйста как написать свой компаратор для setЭто будет использоваться в целях спортивного программирования