我有一个来自array_diff
函数的数组,如下所示:
Array
(
[0] => world
[1] => is
[2] => a
[3] => wonderfull
[5] => in
[6] => our
)
如您所见,键#3和#5之间有空隙(即没有键#4)。 如何将数组分成两部分,如果有更多的空白,可能还要更多? 预期的输出将是:
Array
(
[0] => Array
(
[0] => world
[1] => is
[2] => a
[3] => wonderfull
)
[1] => Array
(
[0] => in
[1] => our
)
)
答案 0 :(得分:5)
您可以使用old_key
,new_key
概念检查是否存在1差?如果没有,则在结果数组中创建新索引,否则在同一索引上添加值:-
<?php
$arr = Array(0 => 'world',1 => 'is',2 => 'a',3 => 'wonderfull',5 => 'in',6 => 'our');
$new_array = [];
$old_key = -1;
$i = 0;
foreach($arr as $key=>$val){
if(($key-$old_key) ==1){
$new_array[$i][] = $val;
$old_key = $key;
}
if(($key-$old_key) >1){
$i++;
$new_array[$i][] = $val;
$old_key = $key;
}
}
print_r($new_array);
答案 1 :(得分:1)
您可以使用数组内部指针遍历数组。
<?php
$arr = Array(0=>"world",1=>"is",2=>"a",3=>"wonderfull",5=>"in",6=>"our");
print_r($arr);
$result = Array();
$lastkey;
while($word = current($arr))
{
$key = key($arr);
if(isset($lastkey) && $key == $lastkey + 1)
{
$result[count($result) - 1][] = $word;
}
else
{
$result[] = Array($word);
}
$lastkey = $key;
next($arr);
}
print_r($result);
?>
答案 2 :(得分:0)
您尚未收到完善的/经过充分考虑的解决方案,因此我会提供。
在确定是否应生成新的增量密钥时,有两项重要检查:
代码:(Demo)
$array = [
1 => 'world',
2 => 'is',
3 => 'a',
4 => 'wonderfull',
6 => 'in',
8 => 'our'
];
$prev = -1;
$i = 0;
foreach ($array as $key => $val) {
if (++$prev && $key - $prev) { // $prev+1 != 0 AND $key-$prev+1 != 0
// or if ($prev > -1 && $key - $prev > 1 ) {
++$i; // increment index
}
$result[$i][] = $val; // store the $val unconditionally
$prev = $key; // update $prev for next iteration
}
var_export($result);
输出:
array (
0 =>
array (
0 => 'world',
1 => 'is',
2 => 'a',
3 => 'wonderfull',
),
1 =>
array (
0 => 'in',
),
2 =>
array (
0 => 'our',
),
)
此解决方案使用我的示例输入生成一个从零开始的索引数组,并且仅使用一个if块。相比之下,AliveToDie的解决方案会生成一个从1开始的数字键数组,并使用两个包含冗余代码行的条件块。