1

静的ファイル キャッシュに次のような配列を使用しています。

[
  key => data => [
             key1 => data    => [...]
                  => expires => 123456
             key2 => data    => [...]
                  => expires => 123456
         ]
      => expires => 123456
]

これは、多くのレベルの深さになる可能性があります (10 ~ 15 レベルの場合もあります)。

私がやりたいのは、データの値のみを返すことです。たとえば、そのような配列を作成するには

[
    key => key1 => [...]
        => key2 => [...]
]

どうすればいいですか?

編集

print_r構造の

Array ( 
[key] => 
    Array (
    [data] => 
        Array (
        [key1] => 
            Array (
            [data] => Array ( ... )
            [expires] => 12345678)
        [key2] =>
            Array (
                [data] => Array ( ... )
                [expires] => 12345678
            )
        ) 
    [expires] => 12345678
    )
)
4

1 に答える 1

0

次のような再帰関数を使用できます。

function extractValues($array, &$result){

    foreach($array as $key1 => $val1){
        if($key1 == 'data' && is_array($val1)) {
            foreach($val1 as $key2 => $val2){

                if(is_array($val2)) {
                    $result[$key2] = array();
                    extractValues($val2, $result[$key2]);
                } else {
                    $result[$key2] = $val2;
                }
            }
        } else if(!in_array($key1, array('expires'))) {
            $result[$key1] = array();
            extractValues($val1, $result[$key1]);
        }

    }

    return $result;
}

次のような配列構造で機能します。

$test = array(
    'key' => array(
        'data' => array(
            'key1' => array(
                'data' => array(
                    'key11' => 11,
                    'key12' => 12,
                ),
            ),
            'key2' => array(
                'data' => array(
                    'key21' => 21,
                    'key22' => 22,
                ),
            ),
        ),
        'expires' => 12345,
    ),
);

$result = array();
extractValues($test, $result);
var_dump($result);

これは、 var_dump() 希望が要件を満たしている結果です。

array(1) {
  ["key"]=>
  array(2) {
    ["key1"]=>
    array(2) {
      ["key11"]=>
      int(11)
      ["key12"]=>
      int(12)
    }
    ["key2"]=>
    array(2) {
      ["key21"]=>
      int(21)
      ["key22"]=>
      int(22)
    }
  }
}
于 2012-11-27T09:36:10.663 に答える