5
配列を再構成したいのですが、stuckoverflowのソリューションの中には、第1レベルの項目に対して「適切」にするのに役立つものもありますが、配列がnレベル深いことに気づくでしょう。親子関係の再構造化nレベル配列(PHP)
方法restructure()は再帰的に使用されません。それはおそらく間違っていると、それを正しくする方法が分かりません。
子供キーは、それぞれのidの持つ子ども、親キーリンク親IDにアイテムがあると言います。
class FilterMenu {
protected $tree = array();
static protected $structure = array();
public function __construct(array $tree)
{
$this->tree = $tree;
}
public function getStructure()
{
self::restructure($this->tree);
return self::$structure;
}
static public function restructure(array $structure)
{
foreach ($structure as $k => $v)
{
if (isset($v['parent']) and isset($v['children']) and count($v['children']) == 1)
{
// only 1 child
self::$structure[$k] = current(array_keys($v['children']));
}
elseif (isset($v['children']))
{
$keys = array_keys($v['children']);
self::$structure[$k] = array_combine($keys, $keys); // mirror array
//self::restructure($v['children']);
}
else
{
// no children
self::$structure[$k] = $k;
}
}
}
}
// test array
$tree = array(
1 => array(
'parent' => 1
),
2 => array(
'parent' => 2,
'children' => array(
3 => array(
'parent' => 2
),
6 => array(
'parent' => 2,
'children' => array(
10 => array(
'parent' => 6,
'children' => array(
4 => array(
'parent' => 10
)
)
)
),
),
),
),
7 => array(
'parent' => 7,
'children' => array(
11 => array(
'parent' => 7
)
)
),
14 => array(
'parent' => 14,
'children' => array(
15 => array(
'parent' => 14,
),
16 => array(
'parent' => 14,
),
19 => array(
'parent' => 14,
),
20 => array(
'parent' => 14,
),
21 => array(
'parent' => 14,
),
)
)
);
// test:
$tree = new FilterMenu($tree);
echo '<pre>'.print_r($tree->getStructure(), true);
実際の結果:
Array
(
[1] => 1
[2] => Array
(
[3] => 3
[6] => 6
)
[7] => 11
[14] => Array
(
[15] => 15
[16] => 16
[19] => 19
[20] => 20
[21] => 21
)
)
所望/期待される結果である:ここ
Array
(
[1] => 1
[2] => Array
(
[3] => 3
[6] => Array
(
[10] => 4 // <-- array with n-levels...
)
)
[7] => 11
[14] => Array
(
[15] => 15
[16] => 16
[19] => 19
[20] => 20
[21] => 21
)
)
クラスとアレイをテストlink to codepadあります。
ご協力いただきまして誠にありがとうございます。ありがとう。
賞賛を参照してください。 @トマラク!あなたのソリューションは、私が最終的な出力に必要なものを正確に行います。この例のクラスは取り除いたバージョンですが、「崩壊」ソリューションは完璧にフィット...どのようにそれを把握する必要があり、上verb8 @なぜ:) – verb8
は正しいことをして、あなたの期待構造が間違っています。このソリューションは元の配列を変更することに注意してください。あなたがそれを望まないなら、あなたはその機能を適応させなければなりません。 – Tomalak
クラスメソッドhttp://codepad.org/O3JV5rQeとしてぶら下がっている機能です。乾杯してください。 – verb8