Intereting Posts
Добавить пользовательскую ссылку в начало страницы Magento Проблема переменных переменных php загрузите большой файл размером от 1 до 2 ГБ с помощью загрузки файла jQuery – blueimp (основанный на Ajax) php / yii, который показывает ошибку в браузере Firefox Как отслеживать использование пользователей на сайте? Как проверить, работает ли указанный PID в настоящий момент, не вызывая ps из PHP? Zend_Search_Lucene против SOLR Ошибка Apache Родитель: дочерний процесс завершен со статусом 3221225477 – Перезапуск Отличается сложным sql-запросом Проблема с PHP mysql bigint Создание более короткого открытого идентификатора Как изменить часовой пояс php-сервера? Ретрансляция недопустимого сообщения при отправке почты с помощью функции PHP Как добавить ограничение на запрос обновления в Zend Framework? Значения $ _SESSION не удерживаются! Самые популярные сообщения WordPress без использования плагинов

Разделить массив на N массивов – PHP

У меня есть массив из 18 значений:

$array = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r'); 

Я хочу разбить этот массив на 12 разных массивов, чтобы он выглядел так:

 array( 0 => array('a', 'b'), 1 => array('c', 'd'), 2 => array('e', 'f'), 3 => array('g', 'h'), 4 => array('i', 'j'), 5 => array('k', 'l'), 6 => array('m'), 7 => array('n'), 8 => array('o'), 9 => array('p'), 10 => array('q'), 11 => array('r') ) 

Моя функция, похоже, не работает

 function array_split($array, $parts){ return array_chunk($array, ceil(count($array) / $parts)); } $result = array_split($array, 12); 

потому что я получаю 9 разных массивов вместо 12. Он вернется

 array( 0 => array('a', 'b'), 1 => array('c', 'd'), 2 => array('e', 'f'), 3 => array('g', 'h'), 4 => array('i', 'j'), 5 => array('k', 'l'), 6 => array('m', 'n'), 7 => array('o', 'p'), 8 => array('q', 'r') ) 

Как мне это сделать? Благодарю.

Эта простая функция будет работать для вас:

Применение

 $array = range("a", "r"); // same as your array print_r(alternate_chunck($array,12)); 

Вывод

 Array ( [0] => Array ( [0] => a [1] => b ) [1] => Array ( [0] => c [1] => d ) [2] => Array ( [0] => e [1] => f ) [3] => Array ( [0] => g [1] => h ) [4] => Array ( [0] => i [1] => j ) [5] => Array ( [0] => k [1] => l ) [6] => Array ( [0] => m ) [7] => Array ( [0] => n ) [8] => Array ( [0] => o ) [9] => Array ( [0] => p ) [10] => Array ( [0] => q ) [11] => Array ( [0] => r ) ) 

Обновление Вышеупомянутое может быть непригодно для большинства случаев … вот еще один тип куска

 $array = range("a", "r"); // same as your array print_r(fill_chunck($array, 5)); 

Вывод

 Array ( [0] => Array ( [0] => a [1] => b [2] => c [3] => d ) [1] => Array ( [0] => e [1] => f [2] => g [3] => h ) [2] => Array ( [0] => i [1] => j [2] => k [3] => l ) [3] => Array ( [0] => m [1] => n [2] => o [3] => p ) [4] => Array ( [0] => q [1] => r ) ) 

Это позволило бы убедиться, что группа в данный момент больше, чем 5 элементов, в которых у другого нет ограничений

Используемая функция

 function alternate_chunck($array, $parts) { $t = 0; $result = array(); $max = ceil(count($array) / $parts); foreach(array_chunk($array, $max) as $v) { if ($t < $parts) { $result[] = $v; } else { foreach($v as $d) { $result[] = array($d); } } $t += count($v); } return $result; } function fill_chunck($array, $parts) { $t = 0; $result = array_fill(0, $parts - 1, array()); $max = ceil(count($array) / $parts); foreach($array as $v) { count($result[$t]) >= $max and $t ++; $result[$t][] = $v; } return $result; } 

Ты сказал:

У меня есть 13 категорий в БД, которые я хочу сгруппировать в 12 массивов. Если существует более 12 категорий, которые есть, то вставьте оставшиеся значения, начиная с первого массива.

Это работает, но что должно быть результатом, если у вас больше элементов в массиве ввода?

 $array = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'); function s($array, $am) { $r = array(); $d = count($array) - $am+1; foreach ($array as $k => $v) { if ($k < $d) { if (!isset($r[0])) { $r[0] = array($v); } else { $r[0] = array_merge($r[0], array($v)); } } else { $r[] = array($v); } } return $r; } 

вернется

 Array ( [0] => Array ( [0] => a [1] => b ) [1] => Array ( [0] => c ) [2] => Array ( [0] => d ) [3] => Array ( [0] => e ) [4] => Array ( [0] => f ) [5] => Array ( [0] => g ) [6] => Array ( [0] => h ) [7] => Array ( [0] => i ) [8] => Array ( [0] => j ) [9] => Array ( [0] => k ) [10] => Array ( [0] => l ) [11] => Array ( [0] => m ) ) 

Вы можете использовать array_chunk и array_merge для этой проблемы:

 <?php $array = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r'); $chunked_arr = array_chunk($array,12); $j = 0; for($i = 0; $i < count($chunked_arr[0]); $i++){ if(!($i % 2 == 0)){ $first_combined[$j][$i % 2] = $chunked_arr[0][$i]; $j++; } else { $first_combined[$j][$i % 2] = $chunked_arr[0][$i]; } } $merged_array = array_merge($first_combined, $chunked_arr[1]); echo '<pre>'; print_r($merged_array); ?> 

И вы получите результат следующим образом:

 Array ( [0] => Array ( [0] => a [1] => b ) [1] => Array ( [0] => c [1] => d ) [2] => Array ( [0] => e [1] => f ) [3] => Array ( [0] => g [1] => h ) [4] => Array ( [0] => i [1] => j ) [5] => Array ( [0] => k [1] => l ) [6] => m [7] => n [8] => o [9] => p [10] => q [11] => r ) 

Это то, что вы хотите.

Демо-версия здесь >>

ceil(count($array) / $parts) дал бы 2, поэтому каждый массив заполняется 2 пунктами, пока у вас не останется 2 предмета. следовательно, последний имеет 1 элемент. это будет работать, когда у вас будет огромное количество данных в массиве, но не так много, когда у вас есть небольшой объем данных.

То, что вы описываете, – это не то, для чего создан array_chunk. Вы должны использовать array_slice () и вычислить, какие части массива вы хотите получить в виде новых массивов. (и использовать цикл for для итерации по вашему исходному массиву)

Обновить:

Некоторые расчеты, которые могут вам помочь:

 minimum_fill = floor(array_length / nr_buckets) bigger_buckets_amount = array_length - (minimum_fill / nr_buckets) 

Алгоритм для заполнения ведер: Зациклируйте по массиву, заполните первое значение bigger_buckets_amount ковшей с помощью (minimum_fill + 1) , заполните остальные ведра с помощью minimum_fill

Скомпилируйте это и посмотрите, не делает ли это для вас:

 <?php $array = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'); $sliceA = 0; $sliceB = 2; $final = array(array_slice($array, $sliceA, $sliceB)); for ($i=$sliceB; $i<sizeof($array); $i++) { $final[$sliceB-1] = array($array[$i]); $sliceB++; } var_dump($final); 
 <?php $array = range('a','r'); $length = array(2=>6,1=>6); // 2=>6 means -- first six elements of new array will have 2 elements each and then, 1=>6 means -- next six elements of new array will have 1 element each $target = array(); // or use [] in PHP 5.4 foreach($length as $i=>$times) { while($times>0){ $target[] = array_splice($array, 0, $i); $times--; } } print_r($target); ?> в <?php $array = range('a','r'); $length = array(2=>6,1=>6); // 2=>6 means -- first six elements of new array will have 2 elements each and then, 1=>6 means -- next six elements of new array will have 1 element each $target = array(); // or use [] in PHP 5.4 foreach($length as $i=>$times) { while($times>0){ $target[] = array_splice($array, 0, $i); $times--; } } print_r($target); ?> 

Это сделает это за вас!
Здесь я использовал свою функцию smallify (), чтобы разбить массив из 15 элементов на 3 массива по 5 элементов каждый.

 <?php $bigArray = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); echo ("<pre>"); print_r (smallify($bigArray, 3)); echo ("<pre/>"); function smallify($arr, $numberOfSlices){ $sliceLength = sizeof($arr) /$numberOfSlices; for($i=1; $i<=$numberOfSlices; $i++){ $arr1 = array_chunk($arr, $sliceLength*$i); return $arr1; unset($arr1); } } ?> с <?php $bigArray = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); echo ("<pre>"); print_r (smallify($bigArray, 3)); echo ("<pre/>"); function smallify($arr, $numberOfSlices){ $sliceLength = sizeof($arr) /$numberOfSlices; for($i=1; $i<=$numberOfSlices; $i++){ $arr1 = array_chunk($arr, $sliceLength*$i); return $arr1; unset($arr1); } } ?> 

результат

 Array ( [0] => Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) [1] => Array ( [0] => 6 [1] => 7 [2] => 8 [3] => 9 [4] => 10 ) [2] => Array ( [0] => 11 [1] => 12 [2] => 13 [3] => 14 [4] => 15 ) ) 

Я считаю, проблема в том, что вы используете размер 2 при использовании array_chunk. Это гарантирует, что каждый созданный новый массив имеет по возможности два элемента. Это заставляет функцию запускать переменные, чтобы поместить их в новые массивы к моменту, когда вы доберетесь до 10. Вы можете найти руководство по функции здесь http://php.net/manual/en/function.array-chunk. Надеюсь, это поможет