2016-05-13 4 views
2

配列を整理するコードを作成しようとしています。多次元array_valuesは整数キーのみ

$arr = array(0=>array('key 1'=>'value 1', 'key 2'=>'value 2', 'key 3'=> array('2'=>'more values 1', '5'=>'more values 2', 7=>'more values 3')), 
       2=>array(0=>'value 1', 2=>'value 2', 4=> array('key 2'=>'more values 1', 'key 5'=>'more values 2', 'key 7'=>'more values 3'))); 

echo print_r($arr); 

収量:

Array 
(
    [0] => Array 
     (
      [key 1] => value 1 
      [key 2] => value 2 
      [key 3] => Array 
       (
        [2] => more values 1 
        [5] => more values 2 
        [7] => more values 3 
       ) 
     ) 

    [2] => Array 
     (
      [0] => value 1 
      [2] => value 2 
      [4] => Array 
       (
        [key 2] => more values 1 
        [key 5] => more values 2 
        [key 7] => more values 3 
       ) 
     ) 
) 

私は整数にキーがarray_values()で名前を変更することができたかった私はこのコードを持っています。配列には次のような出力が必要です。

Array 
(
    [0] => Array 
     (
      [key 1] => value 1 
      [key 2] => value 2 
      [key 3] => Array 
       (
        [0] => more values 1 
        [1] => more values 2 
        [2] => more values 3 
       ) 
     ) 

    [1] => Array 
     (
      [0] => value 1 
      [1] => value 2 
      [2] => Array 
       (
        [key 2] => more values 1 
        [key 5] => more values 2 
        [key 7] => more values 3 
       ) 
     ) 
) 

残念ながら、私はコードを作成できませんでした。

+0

これは興味深い問題ですが、なぜですか?それはちょうどリストです、なぜ数字の重要な問題ですか? – AbraCadaver

+0

imo、PHP配列を処理したいのにキーがわからない場合はイテレータを使用しますか? i、e、 'foreach($ inputArray as $ key => $ value){...'。もしあなたが別の配列に会ったら、新しい配列で 'recurse'するだけです。注:あなたはすべてのエントリを発見し、 "配列キー"について何も知る必要はありません。それは配列キーが何であるかを伝えます。 –

+0

@AbraCadaver:私はPHPを初めて使い、forステートメント(整数あり)で使用でき、非整数インデックスを保持できるスクリプトを作成していました。私は、私のコードを勉強し改善することを約束します。もう一度、あなたの大きな助けに感謝します。 –

答えて

1

キーをインクリメントせずに配列要素にアクセスできるようにする必要があることは非常にまれです(foreach()など)。

function array_reindex_recursive(&$array) { 
    if(is_int(key($array))) { 
     $array = array_values($array); 
    } 
    foreach($array as $key => &$val) { 
     if(is_array($val)) { 
      array_reindex_recursive($val); 
     } 
    } 
}  

array_reindex_recursive($arr); 
  • そうにarray_values()を実行した場合、それは整数(他のキーが整数でない場合、これは問題になる可能性)
  • であるかどうかを確認するために、配列の最初のキーを確認します。しかし、ここで再帰関数であります値を通じて
  • ループのインデックスを再作成し、1であれば、配列は、関数を呼び出す再帰的

あなたはすべてのキーが整数最初を交換していることを確認するにはこのような何かを持つ10:

if(count(array_filter(array_keys($array), 'is_int')) == count($array)) { 
    $array = array_values($array); 
} 
  • フィルターうち、すべての非整数キーと同じ長さは、すべてのキーが整数、
  • のインデックスを再作成する array_values()を実行した場合は、元の配列
  • の長さと比較
+0

うわー!魅力のように動作します。どうもありがとうございました! –