Как разбить динамический массив на подмассивы

Предположим, вам задан массив

$input = array(1,1,1,2,2,3,3,4,5,5);

Если вы хотите разбить массив так, чтобы у вас было все 1 в одном массиве, все 2 в одном массиве и т.д.

Тем не менее, вы не знаете, будет ли массив $ input содержать только 1, или только 1 и 2, или сколько их числа.

Числа численно упорядочены.

4 ответа

array_count_values () может помочь вам, см., например, ссылку ниже.

http://php.net/manual/en/function.array-count-values.php


Это довольно простой, просто установите ключ и значение и постройте вложенные массивы.

$input = array(1,1,1,2,2,3,3,4,5,5);
 $output = array();
 foreach ( $input as $i ){
 if(!isset( $output[$i] ) ){
 $output[$i] = array();
 }
 $output[$i][] = $i;

 }
 echo '<pre class="prettyprint linenums">';
 var_export( $output );

Выходы

array (
 1 =>
 array (
 0 => 1,
 1 => 1,
 2 => 1,
 ),
 2 =>
 array (
 0 => 2,
 1 => 2,
 ),
 3 =>
 array (
 0 => 3,
 1 => 3,
 ),
 4 =>
 array (
 0 => 4,
 ),
 5 =>
 array (
 0 => 5,
 1 => 5,
 ),
 )

входные

$input = array(1,2,3,3,4,2,3,1,8,7);

Выходы

array (
 1 =>
 array (
 0 => 1,
 1 => 1,
 ),
 2 =>
 array (
 0 => 2,
 1 => 2,
 ),
 3 =>
 array (
 0 => 3,
 1 => 3,
 2 => 3,
 ),
 4 =>
 array (
 0 => 4,
 ),
 8 =>
 array (
 0 => 8,
 ),
 7 =>
 array (
 0 => 7,
 ),
 )


Если вы не заинтересованы в производительности, можно использовать простой цикл и array_slice(). Следите за тем, где вы находитесь в массиве $input, и срезайте массив при изменении значения.

$input = array(1,1,1,2,2,3,3,4,5,5);
$curr = $input[0];
$count = 0;
$offset = 0;
$length = 0;
$result_array = array();
foreach($input as $i)
{
 if($i != $curr)
 {
 $result_array[] = array_slice($input, $offset, $length);
 $curr = $i;
 $offset = $count;
 $length = 0;
 }
 $count++;
 $length++;
}
$result_array[] = array_slice($input, $offset);


Не совсем уверен, что именно вы ищете, но если вы хотите, чтобы их разделили на массив одинаковых значений, сгруппированных в массивы:

$input = array(1,1,1,2,2,3,3,4,5,5);
$parts = array_count_values($input);

foreach ($parts as $key => $val) {
 $parts[$key] = array_fill(0, $val, $key);
}

http://codepad.org/cxAL71r8

И если ключи должны быть последовательными и не связаны с вашими значениями:

$parts = array_values($parts);

http://codepad.org/zHFpHBTY

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

licensed under cc by-sa 3.0 with attribution.