2017-05-10 11 views
2

キー「名前空間」を使用して配列をフラット化する方法はありますか。ような何か:Laravelコレクション:フルキー名で平滑化

$a = collect([ 
    'id' => 1, 
    'data' => [ 
     'a' => 2, 
     'b' => 3 
    ] 
]); 

$a = $a->flattenWithKeysNamespace(); // <-- this does not exists 

// Should returns: 
// ['a' => 1, 'data.b' => 2, 'data.c' => 3]; // <-- I would like this. 

は、私は生のPHPで、またはコレクションの機能のいくつかのアセンブリでこれを行うことができます知っているが、時々私はLaravelコレクションのドキュメントで何かを欠場します。では、これを行うためのCollection関数を使用する簡単な方法がありますか?

+1

あなたが正しいと思うのは、これを行うための "ララヴェルの道"がないということです。 [this](http://stackoverflow.com/a/9546235/1123303)のような答えは、 'Collection'を配列に変換しようと思っている場合にPHPで行う方法を示しますが、生のPHPに言及しているのであなたはすでにこの種の解決策を見つけました。 'Collection'メソッドを使ってそれをやっている最善の策は、私がリンクしているものに似た関数を書くことですが、' flatMap() 'のような関数を使い、あなたの要素がコレクションであるときに再帰的に関数を呼び出します。 – Radical

+0

ありがとう!あなたは答えとしてあなたのコメントを投稿することができ、私はそれを受け入れます! –

答えて

1

あなたが正しいと思うのは、これを行うための "ララベル道"がないということです。 thisのような回答は、Collectionを配列に変換したい場合にPHPで行う方法を示しますが、未処理のPHPに言及しているので、この種の解決策をすでに見つけたと仮定します。

私はCollectionメソッドを使ってそれをやっている最善の策は、私がリンクしているものと同じ関数を書くことですが、flatMap()のような関数を使用し、要素がコレクションでも再帰的に呼び出します。

0

変換する深さのレベルについて気にしない場合は、最も簡単なオプションはarray_dotヘルパー機能です。再帰がどのくらい深く進むべきか、ドット区切りの配列キーを持つかどうかをより細かく制御したいのであれば、それを行うためのコレクションマクロを書いています。通常collect($array)->collapse()は文字列キーを保持しますが、たとえ文字列にタイプ強制されていても、非インクリメンタルな数値文字はまだ失われています。最近、私はそれらを維持する必要がありました。

あなたAppServiceProvider::boot()方法でこれを入れて:

/** 
    * Flatten an array while keeping it's keys, even non-incremental numeric ones, in tact. 
    * 
    * Unless $dotNotification is set to true, if nested keys are the same as any 
    * parent ones, the nested ones will supersede them. 
    * 
    * @param int $depth How many levels deep to flatten the array 
    * @param bool $dotNotation Maintain all parent keys in dot notation 
    */ 
    Collection::macro('flattenKeepKeys', function ($depth = 1, $dotNotation = false) { 
     if ($depth) { 
      $newArray = []; 
      foreach ($this->items as $parentKey => $value) { 
       if (is_array($value)) { 
        $valueKeys = array_keys($value); 
        foreach ($valueKeys as $key) { 
         $subValue = $value[$key]; 
         $newKey = $key; 
         if ($dotNotation) { 
          $newKey = "$parentKey.$key"; 
          if ($dotNotation !== true) { 
           $newKey = "$dotNotation.$newKey"; 
          } 

          if (is_array($value[$key])) { 
           $subValue = collect($value[$key])->flattenKeepKeys($depth - 1, $newKey)->toArray(); 
          } 
         } 
         $newArray[$newKey] = $subValue; 
        } 
       } else { 
        $newArray[$parentKey] = $value; 
       } 
      } 

      $this->items = collect($newArray)->flattenKeepKeys(--$depth, $dotNotation)->toArray(); 
     } 

     return collect($this->items); 
    }); 

を次にあなたがcollect($a)->flattenKeepKeys(1, true);を呼び出して、あなたが期待しているものを取り戻すことができます。

関連する問題