2011-05-12 2 views
2

у меня есть массив как:PHP разделение массива между двумя значениями

Array ([0] => #!A1#DC [1] => #IMSR102.71/74.82 [2] => #HV50 [3] => #PR7/7/ [4] => #RX0 [5] => #ERN/1//0 [6] => #Q2 [7] => #!A1#DC [8] => #IMSR102.50/74.82 [9] => #HV40 [10] => #PR5/5/ [11] => #RX0 [12] => #ERN/1//1 [13] => #Q2 etc etc with hundreds o values 

я получаю этот массив из файла (с файлом функции ($ файла)) и мне нужно разделить его на многих подмассива.

«! A1 # DC» это начало серии значений, заканчивающихся # Q2, но число значений между началом и концом не всегда одинаково, и только 2 значения, которые являются то же самое - два заданных («! A1 # DC» для начала и «# Q2» для конца) как я могу получить что-то вроде этого?

Array ( 
[0] => Array ( [0] => #!A1#DC [1] => #IMSR102.71/74.82 [2] => #HV50 [3] => #PR7/7/ [4] => #RX0 [5] => #ERN/1//0 [6] => #Q2) 
    [1] => Array (
    [1] => #!A1#DC [2] => #IMSR102.50/74.82 [3] => #HV40 [4] => #PR5/5/ [5] => #RX0 [6] => #ERN/1//1 [7] => #Q2 etc etc 

не могли бы вы помочь мне?

благодаря

ответ

3

Loop через массив. Когда вы встретите начальное значение, сохраните его индекс. Когда вы встретите конечное значение, используйте array_slice() для извлечения части между последней парой начальных и конечных значений, сохраните эту часть в другом массиве.

$source = array (
    '#!A1#DC', 
    '#IMSR102.71/74.82', 
    '#HV50', 
    '#PR7/7/', 
    '#RX0', 
    '#ERN/1//0', 
    '#Q2', 
    '#!A1#DC', 
    '#IMSR102.50/74.82', 
    '#HV40', 
    '#PR5/5/', 
    '#RX0', 
    '#ERN/1//1', 
    '#Q2', 
); 

$dest = array(); 

$startValue = '#!A1#DC'; 
$endValue = '#Q2'; 

$startIndex = 0; 
foreach ($source as $index => $value) { 
    if ($value === $startValue) { 
     $startIndex = $index; 
    } else 
    if ($value === $endValue) { 
     $dest[] = array_slice($source, $startIndex, $index - $startIndex + 1); 
    } 
} 

print_r($dest); 
+0

спасибо, что вы решили мою проблему :) – Matteo

1

В основном вам нужно перебрать каждый элемент $input, собирая те, в START и END элементов в отдельный массив:

$input = array("#!A1#DC", "A", "B", "#Q2"); 
$values = array(); 
$current = 0; 

define("START", "#!A1#DC"); 
define("END", "#Q2"); 
for ($i = 0; $i < count($input); $i++) { 
    if ($input[$i] == END) { 
     // Ignore any elements after this point until we see START 
     $current = null; 
    } else if ($input[$i] == START) { 
     // Create a new current collection array 
     $current = count($values); 
     $values[$current] = array(); 
    } else { 
     // Store the value if we are collecting 
     if ($current !== null) { 
      $values[$current][] = $input[$i]; 
     } 
    } 
} 
+0

Вызов функции в условиях цикла является пустой тратой ресурсов, если она гарантированно возвращает то же значение в каждой итерации - значение 'счетчика ($ ввода)' должны храниться в переменной. – binaryLV

+0

Довольно уверен, что PHP кэширует это внутри, это микро-оптимизация в любом случае. – Ross

+1

PHP не кэширует его. Это может быть микро-оптимизация, это может быть не так - зависит. Кто знает, может быть, эта функция будет называться только один раз в год. Хотя в тяжелой системе с большими объемами данных она может сэкономить несколько секунд. '$ array = range (1, 1000000)', 'for' loop с вызовом' count() 'на каждой итерации занимает более 10 секунд, сохраняя' count() 'в переменной и используя эту переменную - всего 0,2 секунды. Использование переменной и чтение '$ array [$ n]' на каждой итерации - около 0,4 секунды. Это не займет несколько часов, чтобы сделать эту переменную, вы не потеряете руку при этом;) – binaryLV

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