2011-08-09 10 views
7

私は実際の成功なしにこれに対する解決策を探してきました。私は深さに制限のない親と子の多次元配列を持っています。これは、データベースから生成されているが、問題は、アイテムIDがそうのような多次元配列にフラットな配列を配置する私の方法使用して、鍵になるとされています。私が望む何多次元配列の配列キーをリセットする

Array(

[28] => Array 
     (
      [id] => 28 
      [color] => #ff24e5 
      [name] => Personal 
      [parent_id] => 
      [children] => Array 
       (
        [23] => Array 
         (
          [id] => 23 
          [color] => #41c3a3 
          [name] => Shopping 
          [parent_id] => 28 
          [children] => Array 
           (
            [22] => Array 
             (
              [id] => 22 
              [color] => #8be32b 
              [name] => Deals 
              [parent_id] => 23 
              [children] => Array 
               (
               ) 
             ) 
           ) 
         ) 

        [150] => Array 
         (
          [id] => 150 
          [color] => #e9a3f0 
          [name] => Orders 
          [parent_id] => 28 
          [children] => Array 
           (
           ) 
         ) 
       ) 
     ) 
) 

を行う関数であります

Array (
[0] => Array 
     (
      [id] => 28 
      [color] => #ff24e5 
      [name] => Personal 
      [parent_id] => 
      [children] => Array 
       (
        [0] => Array 
         (
          [id] => 23 
          [color] => #41c3a3 
          [name] => Shopping 
          [parent_id] => 28 
          [children] => Array 
           (
            [0] => Array 
             (
              [id] => 22 
              [color] => #8be32b 
              [name] => Deals 
              [user_id] => 1 
              [selected] => 0 
              [parent_id] => 23 
              [children] => Array 
               (
               ) 
             ) 
           ) 
         ) 

        [1] => Array 
         (
          [id] => 150 
          [color] => #e9a3f0 
          [name] => Orders 
          [parent_id] => 28 
          [children] => Array 
           (
           ) 
         ) 
       ) 
     ) 
) 

は基本的に、私は多くの方法を試してみた0から始まるキーを再割り当てが、私は再帰的な解決策を見つける必要があると仮定していると私がすることを試みたとき、それは私の配列を破壊した次の。私はarray_walk_recursive()関数を読んでいましたが、それを超えて何をすべきかはわかりません。基本的に、多次元配列の数値キーをリセットする方法はありますか?

ありがとうございました!私は同じ問題を解決しようとしていた

+0

私はあなたの質問に答えましたあなたがそれを聞いた直後に2時間後、帰りますか?これがあなたの質問に答えた場合は、回答の横にあるチェックマークアイコンをクリックして、それを合格とマークしてください。 –

答えて

12
function fix_keys($array) { 
    foreach ($array as $k => $val) { 
    if (is_array($val)) 
     $array[$k] = fix_keys($val); //recurse 
    } 
    return array_values($array); 
} 
+0

素晴らしい、優雅な解決策+1 – RageD

+0

素晴らしい!ありがとう。メールを受け取らなかったので、私は今チェックしただけです。 – flicker

+1

これは機能しますが、数値ではない配列キーが失われています。数値キーの再割り当てはどうすればよいでしょうか?ありがとうございました – flicker

11

、ここにあなたが本当にテキストキーがアップ混入を停止するIS_NUMERIC条件を追加する必要があるコード

$array = array_values($array); 
10

は...

function fix_keys($array) { 

    foreach ($array as $k => $val) { 

     if (is_array($val)) 
      $array[$k] = $fix_keys($val); //recurse 
    } 

    if(is_numeric($k)) 
     return array_values($array); 

    return $array; 
} 
です

代わりにこれを行いました:

function fix_keys($array) { 
    $numberCheck = false; 
    foreach ($array as $k => $val) { 
     if (is_array($val)) $array[$k] = fix_keys($val); //recurse 
     if (is_numeric($k)) $numberCheck = true; 
    } 
    if ($numberCheck === true) { 
     return array_values($array); 
    } else { 
     return $array; 
    } 
} 
+0

素晴らしい!現在の正解はそうではありませんでしたが、これは私のために素晴らしい仕事でした。 – Patrick