2017-12-11 33 views
0

で一つだけの要素が含まれているとき、私はそれだけで一つの要素と親配列のキーが数値で含まれている場合は、親に子配列データを移動しようとしている親にフラット化。私はそれを完全に平らにしたくありません。私は配列の構造を保持したい。子配列の中には、上位のものを除いて数字キーは必要ありません。PHPは、サブ配列は数値インデックス

私の入力データ:

[8] => Array 
    (
     [any] => Array 
      (
       [0] => Array 
        (
         [all] => Array 
          (
           [0] => stdClass Object 
            (
             [f] => test1 

            ) 

           [1] => Array 
            (
             [0] => Array 
              (
               [any] => Array 
                (
                 [0] => Array 
                  (
                   [all] => Array 
                    (
                     [0] => stdClass Object 
                      (
                       [f] => test2 

                      ) 

                     [1] => stdClass Object 
                      (
                       [f] => test3 

                      ) 

                    ) 

                  ) 

                ) 

              ) 

            ) 

          ) 

        ) 

      ) 

    ) 

私の理想の出力:

[8] => Array 
        (
         [any] => Array 
          (
           [all] => Array 
            (
             [0] => stdClass Object 
              (
               [f] => test1 

              ) 


             [any] => Array 
                (
                 [all] => Array 
                  (
                   [0] => stdClass Object 
                    (
                     [f] => test2 

                    ) 

                   [1] => stdClass Object 
                    (
                     [f] => test3 

                    ) 

                  ) 

                ) 

              ) 

            ) 

          ) 

        ) 

私は多次元配列で動作するようにしようとしています。 次の機能を試しました。

次の出力があります。私はまた、追加のelseif条件を追加しようとした条件「の子配列の どれも数字キーを持つべきではない」

[8] => Array 
        (
         [any] => Array 
          (
           [all] => Array 
            (
             [0] => stdClass Object 
              (
               [f] => test 

              ) 

             [1] => Array 
              (
               [any] => Array 
                (
                 [all] => Array 
                  (
                   [0] => stdClass Object 
                    (
                     [f] => test 

                    ) 

                   [1] => stdClass Object 
                    (
                     [f] => test 

                    ) 

                  ) 

                ) 

              ) 

            ) 

          ) 

        ) 

      ) 

を満たすために、それを修正することができませんでし除きすべてがよさそうだが、動作していないよう...

elseif((is_numeric($k) && (key($v) == 'all' || key($v) == 'any') && count($v) == 1)){     // if all or any are under numeric index array , remove numeric index array and move a level up 
        $arr[key($v)] = reset($v); 
       } 

答えて

0

一つの方法として、カウントのためにと

foreach ($arr as $key => $value) { 
    if (count($value) == 1 && is_numeric(key($value))) { // Check count and key if numeric 
     $arr[$key] = reset($value);      // Return child array by reset 
    } 
} 

print_r($arr); 
+1

IS_NUMERICは偉大な動作するかどうかチェックした後reset()を使用することです。ありがとうございました。 – subra

+0

こんにちはアーウィンは、私はそれは素晴らしい仕事を、あなたの提案を試してみました。私は数字キーのない子配列を持っていたかったのです。あなたは何か提案があるのだろうか?私は例とコード – subra

+0

で私の質問を更新しました。一番上のキーを英数字にして、追加のelseif条件を追加しました。関数flattenKeyZero(&$のARR){foreachの($ ARRとして$ K =>&$ V){IF(IS_ARRAY($ V)){IF((カウント($ V)== 1 && IS_NUMERIC(キー($ V) )))){$ arr [$ k] =リセット($ v); } ELSEIF((IS_NUMERIC($ K)&&カウント($ V)== 1)){$のARR [キー($ V)] =リセット($ V)。 解除($ [$ k]をARR)。他 } { の$ this - > flattenKeyZero($ V)。 } } } } – subra

関連する問題