Php代码
代码如下 | |
* $sourceArr 原来的数组 * $key 主键 * $parentKey 与主键关联的父主键 * $childrenKey 生成的孩子的键名 * */ function arrayToTree($sourceArr, $key, $parentKey, $childrenKey) { $tempSrcArr = array(); foreach ($sourceArr as $v) { $tempSrcArr[$v[$key]] = $v; } $i = 0; $count = count($sourceArr); for($i = ($count - 1); $i >=0; $i--) { if (isset($tempSrcArr[$sourceArr[$i][$parentKey]])) { $tArr = array_pop($tempSrcArr); $tempSrcArr[$tArr[$parentKey]][$childrenKey] = (isset($tempSrcArr[$tArr[$parentKey]][$childrenKey]) && is_array($tempSrcArr[$tArr[$parentKey]][$childrenKey])) ? $tempSrcArr[$tArr[$parentKey]][$childrenKey] : array(); array_push ($tempSrcArr[$tArr[$parentKey]][$childrenKey], $tArr); } } return $tempSrcArr; } |
Phpコード
* 配列をツリーに変換します
* 例:convert array(
array('id'=>1,'parentId' => 0,'name'=> 'name1')
,array('id'=>2,'parentId' => 0,'name'=> 'name2')
,array('id'=>4,'parentId' => 1,'name'=> 'name1_4')
,array('id'=>15,'parentId' => 1,'name'=> 'name1_5')
);
に変換*配列(
[1] => 配列([id] => 1
)[親ID] => 0
[名前] => 名前1
[子] => Array(
[0] => 配列([id] => 15,[parentId] => 1,[name] => name1_5)
[1] => Array([id] => 4,[parentId] => 1,[name] => name1_4)
)
)
[2] => Array([id] => 2,[parentId] => 0,[name] => name2)
)
* @param array $sourceArr 変換対象の配列
* @param string $key 配列内の親と子を確認するためのキー、例では「id」です
* @param string $parentKey 配列内の親キー、この例では「parentId」です
* @param type $childrenKey ツリーノードの子ノードにインデックスを付けるキー、例では「children」
* @return 配列は生成されたツリーを返します
*/
代码如下 | |
関数 arrayToTree($sourceArr, $key, $parentKey, $childrenKey) { $tempSrcArr = 配列(); $allRoot = TRUE; foreach ($sourceArr as $v) { $isLeaf = TRUE; foreach ($sourceArr as $cv ) { if (($v[$key]) != $cv[$key]) { if ($v[$key] == $cv[$parentKey]) { $isLeaf = FALSE; } if ($v[$parentKey] == $cv[$key]) { $allRoot = FALSE; } } } if ($isLeaf) { $leafArr[$v[$key]] = $v; } $tempSrcArr[$v[$key]] = $v; } if ($allRoot) { $tempSrcArr を返します。 } その他 { unset($v, $cv, $sourceArr, $isLeaf); foreach ($leafArr as $v) { if (isset($tempSrcArr[$v[$parentKey]])) { $tempSrcArr[$v[$parentKey]][$childrenKey] = (isset($tempSrcArr[$v[$parentKey]][$childrenKey]) && is_array($tempSrcArr[$v[$parentKey]][$childrenKey] ))? $tempSrcArr[$v[$parentKey]][$childrenKey] : array(); array_push ($tempSrcArr[$v[$parentKey]][$childrenKey], $v); unset($tempSrcArr[$v[$key]]); } unset($v); return arrayToTree($tempSrcArr, $key, $parentKey, $childrenKey); } } |
$rows = array(
0 => array('id' => 1, 'name' => 'メニュー 1', 'parentId' => 0)
, 1 => array('id' => 2, 'name' => 'Menu 2', 'parentId' => 0)
, 2 => array('id' => 3, 'name' => 'Menu 3', 'parentId' => 0)
, 3 => array('id' => 4, 'name' => 'Menu 1_1', 'parentId' => 1)
, 4 => array('id' => 5, 'name' => 'Menu 1_2', 'parentId' => 1)
, 5 => array('id' => 6, 'name' => 'Menu 2_1', 'parentId' => 2)
);
print_r(getTree($rows, 0, 'id', 'parentId'));
* @staticvar int $ Depth 再帰の深さ * @param array $data 配列データ * @param integer 親 ID の $pid 値 * @param string $key id $data 配列内のキーの値 * @param string $chrildKey 生成される子のキー値 * @param string $pKey $data 配列内の親 ID のキー値 * @param int $maxDepth 無限再帰を防ぐための最大再帰深さ * @return array 再編成された配列 */ function getTree($data, $pid = 0, $key = 'id', $pKey = 'parentId', $childKey = 'child', $maxDepth = 0){ 静的 $ Depth = 0; $深さ++ If (intval($maxDepth) { $maxDepth = カウント($data) * カウント($data); } If ($ Depth > $maxDepth) { exit("エラー再帰:最大再帰深さ {$maxDepth}"); } $tree = 配列(); foreach ($data as $rk => $rv) { If ($rv[$pKey] == $pid) $rv[$childKey] = getTree($data, $rv[$key], $key, $pKey, $childKey, $maxDepth); $tree[] = $rv; } } $tree を返します。 } 一例
|