ツリー配列をフラット化し、それを新しい配列形式の key => value にマップする PHP メソッド
P粉563831052
2023-09-03 20:28:52
<p>我有一个在php中的复杂数组,像这样:</p>
<pre class="brush:php;toolbar:false;">[
0 => [
'id' => '2'
'parent_id' => '1'
'text' => 'Algoritma'
'lvl' => '1'
'nodes' => [
0 => [
'id' => '11'
'parent_id' => '2'
'text' => 'Flowchart'
'lvl' => '2'
'href' => '/site/read-by-type?id=11'
]
1 => [
'id' => '12'
'parent_id' => '2'
'text' => 'Pseudo code'
'lvl' => '2'
'href' => '/site/read-by-type?id=12'
]
]
'href' => '/site/read-by-type?id=2'
]
1 => [
'id' => '3'
'parent_id' => '1'
'text' => 'Pemrograman'
'lvl' => '1'
'nodes' => [
0 => [
'id' => '4'
'parent_id' => '3'
'text' => 'Java'
'lvl' => '2'
'href' => '/site/read-by-type?id=4'
]
1 => [
'id' => '5'
'parent_id' => '3'
'text' => 'PHP'
'lvl' => '2'
'nodes' => [
0 => [
'id' => '8'
'parent_id' => '5'
'text' => 'Yii2 Framework'
'lvl' => '3'
'href' => '/site/read-by-type?id=8'
]
1 => [
'id' => '9'
'parent_id' => '5'
'text' => 'Laravel'
'lvl' => '3'
'href' => '/site/read-by-type?id=9'
]
]
'href' => '/site/read-by-type?id=5'
]
2 => [
'id' => '7'
'parent_id' => '3'
'text' => 'Javascript'
'lvl' => '2'
'href' => '/site/read-by-type?id=7'
]
]
'href' => '/site/read-by-type?id=3'
]
2 => [
'id' => '10'
'parent_id' => '1'
'text' => 'Sistem Operasi'
'lvl' => '1'
'nodes' => [
0 => [
'id' => '13'
'parent_id' => '10'
'text' => 'Mac OS'
'lvl' => '2'
'href' => '/site/read-by-type?id=13'
]
1 => [
'id' => '14'
'parent_id' => '10'
'text' => 'Linux'
'lvl' => '2'
'href' => '/site/read-by-type?id=14'
]
]
'href' => '/site/read-by-type?id=10'
]
]</pre>
<p>我需要将这些数组展平为键值对的格式,即 ['id' => 'text']:</p>
<pre class="brush:php;toolbar:false;">[
2 => ' Algoritma' // 基于这些级别,有1个空格
11 => ' Flowchart', // 基于这些级别,有2个空格
12 => ' Pseudo code', // 基于这些级别,有2个空格
3 => ' Pemrograman' // 基于这些级别,有1个空格
4 => ' Java' // 基于这些级别,有2个空格
5 => ' PHP' // 基于这些级别,有2个空格
8 => ' Yii2 Framework' // 基于这些级别,有3个空格
9 => ' Laravel' // 基于这些级别,有3个空格
10 => ' Sistem Operasi' // 基于这些级别,有1个空格
... 以此类推
]</pre>
<p>到目前为止,我写了这样的代码:</p>
<pre class="brush:php;toolbar:false;">public static function flattingTree(array $tree){
$denormalizeTree = [];
foreach ($tree as $node) {
if(isset($node['nodes'])){
// 我被卡住了...
}
$denormalizeTree[$node['id']] = $node['text'];
}
return $denormalizeTree;
}</pre>
<p>但我只得到了一层:</p>
<pre class="brush:php;toolbar:false;">[
2 => 'Algoritma'
3 => 'Pemrograman'
10 => 'Sistem Operasi'
]</pre>
<p>非常感谢任何帮助...</p>
あなたは思っているより近くにいるのです。関数を再帰的に呼び出して、結果を最終的な配列に追加するだけです。
リーリー ###結果:### リーリー簡単な解決策は、再帰関数を使用して配列を反復処理し、必要なデータを最終的な配列に追加することです。
重要なのは、「展開されていない」配列とデータを保持する変数を受け入れる関数を用意することです (データは変数に保持されます)。最後の引数は参照によって渡されるため、変数自体がデータを保持するように変更されます。
リーリー上記の関数を使用すると、配列を呼び出して結果を保存する変数を指定することで配列を展開できます。
リーリー物事を簡単にするために、
リーリーextract
関数をカプセル化することができ、結果を保存するために空の配列を準備する必要がなくなりました。これで、配列を次のように展開できます:
リーリーさらにお役に立てば幸いです。