2013-03-29 2 views
0

Я хочу создать мульти массив, разбив массив для каждого значения даты:array_chunk с обратным вызовом/значением вместо интервала?

array(
    '3/20/13', // date (start a new child array) 
    '14', 
    'dog', 
    'red', 
    '10/21/13', // date (start a new child array) 
    '3', 
    'cat' 
) 

Я написал сложную foreach функцию, которая построила новый массив путем определения, является ли значение дата:

$date = DateTime::createFromFormat('n/d/y', $value); 

Мне было интересно, есть ли более простой способ разделить массив или мне нужно индивидуально пройти каждое значение? Меня беспокоит то, что array_chunk работает на интервал, но не имеет любой вариант. Я серьезно удивлен, если PHP не может кусаться при обратном вызове.

Я знаю, что есть аналогичный вопрос, но ответы были выполнены вручную через каждое значение. (Breaking an array into groups based on values).

+0

Как вы планируете сделать это без цикла? Плюс, если они работают, почему * не будет * вы его используете? –

+0

@JohnConde PHP имеет так много маленьких магических функций, я надеялся на умное решение 'array_map' или что-то в этом роде. Возможно, есть функция, которую мне не хватает? –

+0

Это слишком специфично для того, чтобы они были для него выделенной функцией. –

ответ

1
  • [x] Протестировано и работает.
  • [] Менее сложный, чем ваш цикл foreach? :)

    // Source array to break into child arrays based on regular expression delimiter 
    $array = array(
        '3/20/13', // date (start a new child array) 
        '14', 
        'dog', 
        'red', 
        '10/21/13', // date (start a new child array) 
        '3', 
        'cat', 
        '01/02/03', // another example 
        '4', 
        'badger' 
    ); 
    
    // Regular expression to break array into child arrays 
    $delimiter = '/\//'; 
    
    // Finds index position of matching delimiter in array (e.g. 0, 4) 
    $childIndex = array_keys(preg_grep($delimiter, $array)); 
    
    // For each matching delimiter get the beginning index position and length of entries before next child begins - they part that array_chunk doesn't support. We feed these begin/length into array_slice next to make our own array 
    for ($i=0; $i<count($childIndex); $i++): 
        $chunks[$i]['begin'] = $childIndex[$i]; 
        // Last chunk doesn't need a length 
        if (isset($childIndex[$i+1])): 
         $chunks[$i]['len'] = $childIndex[$i+1]-$childIndex[$i]; 
        endif; 
    endfor; 
    
    // For each begin/length chunk splice the source array into a child array 
    foreach ($chunks as $chunk): 
        if (isset($chunk['len'])): 
         $final[] = array_slice($array, $chunk['begin'], $chunk['len']); 
        else: 
         $final[] = array_slice($array, $chunk['begin']); 
        endif; 
    endforeach; 
    
    // Our new nested array 
    var_dump($final); 
    

Результаты

// Source 
array (size=10) 
    0 => string '3/20/13' (length=7) 
    1 => string '14' (length=2) 
    2 => string 'dog' (length=3) 
    3 => string 'red' (length=3) 
    4 => string '10/21/13' (length=8) 
    5 => string '3' (length=1) 
    6 => string 'cat' (length=3) 
    7 => string '01/02/03' (length=8) 
    8 => string '4' (length=1) 
    9 => string 'badger' (length=6) 

// Found delimiter positions 
array (size=3) 
    0 => int 0 
    1 => int 4 
    2 => int 7 

// Chunks 
array (size=2) 
    'begin' => int 0 
    'len' => int 4 
array (size=2) 
    'begin' => int 4 
    'len' => int 3 
array (size=1) 
    'begin' => int 7 

// Final nested array 
array (size=3) 
    0 => 
    array (size=4) 
     0 => string '3/20/13' (length=7) 
     1 => string '14' (length=2) 
     2 => string 'dog' (length=3) 
     3 => string 'red' (length=3) 
    1 => 
    array (size=3) 
     0 => string '10/21/13' (length=8) 
     1 => string '3' (length=1) 
     2 => string 'cat' (length=3) 
    2 => 
    array (size=3) 
     0 => string '01/02/03' (length=8) 
     1 => string '4' (length=1) 
     2 => string 'badger' (length=6) 
+0

Вы должны поместить лучший шаблон регулярного выражения для $ delimiter в соответствии с вашим форматом даты, поскольку это просто соответствует '/'. –

+0

jeez, глядя на это, я чувствую, что даже не знаю, как кодировать LOL! Я постараюсь проработать то, что вы сделали. Спасибо за ответ! : D –

+1

Я отредактировал его с лучшими заметками для вас. Это просто вопрос нахождения позиции в массиве, где вы хотите разделить массив, а затем разбивать массив с помощью 'array_slice' http://php.net/manual/en/function.array-slice.php –

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