2016-11-19 3 views
0

Имея массив на входе, так формируется:Как разделить массив по массиву?

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 
     ) 
) 

РНР explode() функции работает для ввода строки. Хотя здесь есть что-то для массива.

+1

Почему не 10 в отдельном массиве? – Rizier123

+0

Значения в этом случае являются целыми. –

+0

Почему я хочу сплит-массив для значения -1. –

ответ

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]] 
+0

Почти, за исключением желаемого выходного индекса 0, это значение, а не массив. – Xorifelse

+0

Да, не уверен, если в начале массива имеется более одного элемента без -1? –

+0

Работайте очень хорошо! Благодарю. –

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 из массива, но разбить массив на -1. Чтобы быть более правильным, подумайте о функции explode(). Он работает для строки, но предположим, что у него есть массив, а не строка. Результат должен быть чем-то вроде: explode ($ delimiter, $ array), но, разумеется, взорваться, сделать массив, разделяющий строку для delimeter. В этом случае (как я попросил) взорвать make массив, начиная с массива, разбивая его на значение value. –

1

Ну вот Solutio n для вас.

$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

Спасибо, хорошо работай тоже. –

Смежные вопросы