2016-05-18 9 views
0

私はこのような、それぞれのIDで識別される鍵のペアを持っている:PHPアレイの再構造化

array(
    'key_a_0' => $a, 
    'key_a_1' => $a, 
    'key_b_0' => $b, 
    'key_b_1' => $b 
    ) 

私は、この構造を必要とする:

array(
    '0' => array(
     'key_a' => $a, 
     'key_b' => $b 
    ), 
    '1' => array(
     'key_a' => $a, 
     'key_b' => $b 
    ) 
) 

これを達成するための最良の方法だろうか?

+2

元のアレイはどのようにして作成されましたか?しばしばそこで修正するのが良い –

+0

元のアレイを変更すると複雑さが増します。これはオプションテーブルからのシリアル化されていないデータです。オリジナルのフラットアレイ構造は、実際にはオプションの初期化とサニタイズの作業を単純に保つものです。 –

答えて

2

は、すべてのデータが存在しているとして、これは、あなたが簡単なforeachループで必要な形式に修正するのは簡単だろう、とのまま正確にどのようにあります。

$new = array(); 

foreach($data as $key => $variable){ 
    list($name,$var,$index) = explode("_", $key); 
    $new[$index][$name . '_' . $var] = $variable; 
} 

Array 
(
    [0] => Array 
     (
      [key_a] => 5 
      [key_b] => 10 
     ) 

    [1] => Array 
     (
      [key_a] => 5 
      [key_b] => 10 
     ) 

) 


理想的に - あなたは、作成、as Dagon saidであなたのアレイ構造を設定したいと思います。

+0

list()とexplode()の組み合わせは、仕事を完璧にし、コードをシンプルでエレガントに保ちます。ありがとうございました !! –

+0

@opportus愉快な仲間!それがあなたを助けてくれてうれしいです。 – Darren

0

次の作業が必要です。しかし、これは、最初の配列が特定の順序で来て、その配列が最終的な配列の各入れ子になった配列内で期待されるものであり、最初の配列のキーが常にその形式であることを前提としています。これを提供

$a = 5; 
$b = 10; 

$aRawArray = array(
    'key_a_0' => $a, 
    'key_a_1' => $a, 
    'key_b_0' => $b, 
    'key_b_1' => $b, 
); 

$aFormattedArray = array(); 

foreach ($aRawArray as $sKey => $mValue) { 
    $aKeyParts = explode('_', $sKey); 
    $sExtractedKey = $aKeyParts[2]; 
    $sNewKey = $aKeyParts[0] . '_' . $aKeyParts[1]; 

    if (!isset($aFormattedArray[$sExtractedKey])) { 
     $aFormattedArray[$sExtractedKey] = array(); 
    } 

    $aFormattedArray[$sExtractedKey][$sNewKey] = $mValue; 
} 

var_dump($aFormattedArray);