0

各日付値で配列を分割して複数配列を作成したい:

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 がコールバックでチャンクできない場合、私は非常に驚いています。

同様の質問があることは承知していますが、回答は各値を手動でループするものでした。(値に基づいて配列をグループに分割する)。

4

1 に答える 1

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)
于 2013-03-29T02:17:03.433 に答える