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

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

$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.