将由包含负值的元素分隔的平面数组元素分组到子数组中

问题描述 投票:0回答:4

在输入中具有这样形成的数组:

Array
(
    [0] => 10
    [1] => -1
    [2] => -1
    [3] => -1
    [4] => -1
    [5] => 15
    [6] => 16
    [7] => 17
    [8] => -1
    [9] => -1
    [10] => 20
)

我如何将它拆分为 -1 值,并输出这样的内容:

Array
(
    [0] => 10
    [1] => Array
        (
            [0] => 15
            [1] => 16
            [2] => 17
        )
    [2] => Array
        ( 
            [0] => 20
        )
)

php

explode()
函数适用于字符串输入。虽然这里有一些数组的东西。

php arrays grouping
4个回答
1
投票
  1 <?php
  2     $array = [10, -1, -1, -1, -1, 15, 16, 17, -1, -1, 20];
  3     $tempArray = [];
  4     $result = [];
  5     foreach($array as $item)
  6     {
  7         if($item == -1)
  8         {
  9             if(count($tempArray))
 10             {
 11                 $result[] = $tempArray;
 12                 $tempArray = [];
 13             }
 14         }
 15         else
 16             $tempArray[] = $item;
 17 
 18     }
 19     if(count($tempArray))
 20     {
 21         $result[] = $tempArray;
 22     }
 23     echo json_encode($result);

结果是,

~$ php cal.php 
[[10],[15,16,17],[20]]

1
投票

这就是您的解决方案。

$myAry = array(
    '0' => 10,
    '1' => -1,
    '2' => -1,
    '3' => -1,
    '4' => -1,
    '5' => 15,
    '6' => 16,
    '7' => 17,
    '8' => -1,
    '9' => -1,
    '10' => 20
);

$newAry = Array();

function splitArray($ary , $index){
    global $newAry;
    if($index == count($ary)){
        return $newAry;
    }
    if( $ary[$index] != -1 ){
        $chunk = array();
        while(  $index < count($ary) && $ary[$index] != -1 ){
            array_push($chunk , $ary[$index]);
            $index++;
        }
        array_push($newAry , $chunk);
        splitArray($ary , $index);

    } else {
        $index++;
        splitArray($ary , $index);
    }
}


splitArray($myAry , 0);
print_r($newAry);

输出:

Array ( 
[0] => Array ( [0] => 10 ) 
[1] => Array ( [0] => 15 [1] => 16 [2] => 17 ) 
[2] => Array ( [0] => 20 ) 
      )

0
投票

使用

array_unique
unset

的结果并不完全相同
$array = array_unique($array);

foreach ($array as $k=>$item) {
   if($item == '-1'){
      unset($array[$k]);
   }
}

输出

array(5) {
  [0]=>
  int(10)
  [5]=>
  int(15)
  [6]=>
  int(16)
  [7]=>
  int(17)
  [10]=>
  int(20)
}

0
投票

为了避免繁琐的结果数组元素计数和跟踪结果索引,只有在没有声明引用时才将引用推送到结果数组中。当遇到 -1 值时,销毁引用,以便遇到下一个限定值,它进入一个新组。 演示

$array = [10, -1, -1, -1, -1, 15, 16, 17, -1, -1, 20];
$result = [];
foreach ($array as $v) {
    if ($v === -1) {
        unset($ref);
        continue;
    }
    if (!isset($ref)) {
        $result[] =& $ref;
    }
    $ref[] = $v;
}
var_export($result);

输出:

array (
  0 => 
  array (
    0 => 10,
  ),
  1 => 
  array (
    0 => 15,
    1 => 16,
    2 => 17,
  ),
  2 => 
  array (
    0 => 20,
  ),
)
© www.soinside.com 2019 - 2024. All rights reserved.