[英]Array for multidimensional array with depth
我有一個大問題(顯然很容易解決),我已經嘗試了24個多小時,以創建一個函數來將數組轉換為帶有depth的多維。
我的數組是
$array = array(
array("name" => "Root_1", "depth"=> "1"),
array("name" => "Children","depth"=> "2"),
array("name" => "Children", "depth"=> "2"),
array("name" => "Children", "depth"=> "2"),
array("name" => "Children","depth"=> "3"),
array("name" => "Children","depth"=> "3"),
array("name" => "Children","depth"=> "3"),
array("name" => "Root_2", "depth"=> "1"),
array("name" => "Children", "depth"=> "2"),
array("name" => "Children", "depth"=> "2"),
array("name" => "Children", "depth"=> "2")
)
我希望輸出為:
$array = array(
array("name" => "Root_1", "depth"=> "1", "children" => array(
array("name" => "Children", "depth"=> "2", "children" => array()),
array("name" => "Children", "depth"=> "2", "children" => array()),
array("name" => "Children", "depth"=> "2", "children" => array(
array("name" => "Children", "depth"=> "3", "children" => array()),
array("name" => "Children", "depth"=> "3", "children" => array()),
array("name" => "Children", "depth"=> "3", "children" => array())
)
)),
array("name" => "Root_2", "depth"=> "1", "children" => array(
array("name" => "Children", "depth"=> "2", "children" => array()),
array("name" => "Children", "depth"=> "2", "children" => array()),
array("name" => "Children", "depth"=> "2", "children" => array(
array("name" => "Children", "depth"=> "3", "children" => array()),
array("name" => "Children", "depth"=> "3", "children" => array()),
array("name" => "Children", "depth"=> "3", "children" => array())
)
)),
);
我嘗試過的
<?php
function createArray($array, $depth) {
$result = array();
$item = array();
if(isset($array["depth"])) {
if(intval($array["depth"]) >= $depth) {
array_push($result, $array);
}
} else {
foreach($array as $value) {
$depthToInt = intval($value["depth"]);
if($depthToInt === $depth) {
array_push($result, $value);
$item = $value;
} else {
$item["children"] = createArray($value, $item["depth"]);
}
}
}
return $result;
}
我有點遲了,但是如果您對非遞歸解決方案感興趣,那么這里有一個簡單的單遍循環( O(n) ):
<?php
function treeify(array $input): array
{
$result = [];
$path = [];
foreach ($input as &$entry) {
$entry['children'] = [];
$depth = $entry['depth'] - 1;
$path = \array_slice($path, 0, $depth);
$path[] = &$entry;
0 === $depth
? $result[] = &$entry
: $path[$depth - 1]['children'][] = &$entry;
}
return $result;
}
print_r(treeify([
['name' => 'Root_1', 'depth' => 1],
['name' => 'Children', 'depth' => 2],
['name' => 'Children', 'depth' => 2],
['name' => 'Children', 'depth' => 2],
['name' => 'Children', 'depth' => 3],
['name' => 'Children', 'depth' => 3],
['name' => 'Children', 'depth' => 3],
['name' => 'Children', 'depth' => 4],
['name' => 'Children', 'depth' => 2],
['name' => 'Root_2', 'depth'=> 1],
['name' => 'Children', 'depth' => 2],
['name' => 'Children', 'depth' => 2],
['name' => 'Children', 'depth' => 2],
['name' => 'Children', 'depth' => 3],
['name' => 'Root_3', 'depth' => 1],
['name' => 'Root_4', 'depth' => 1],
['name' => 'Children', 'depth' => 2],
]));
演示: https : //3v4l.org/1YkvY
好的,很顯然,我們需要遞歸解決方案。
對於每個項目(從虛擬根目錄開始),我們要檢索子級。 假設我們通過過濾掉不是孩子的所有東西來獲得孩子。
我們對過濾器的標准是什么?
因此,我們需要:
這就是我最后得到的。 我不認為這是完美的(我隱約地懷疑我的極限邏輯),但對於示例數據而言,大多數情況下都存在。
$array = array(
array( 'name' => 'Root_1', 'depth' => '1' ),
array( 'name' => 'Children 1-1', 'depth' => '2' ),
array( 'name' => 'Children 1-2', 'depth' => '2' ),
array( 'name' => 'Children 1-2-1', 'depth' => '3' ),
array( 'name' => 'Children 1-3', 'depth' => '2' ),
array( 'name' => 'Children 1-3-1', 'depth' => '3' ),
array( 'name' => 'Children 1-3-2', 'depth' => '3' ),
array( 'name' => 'Children 1-3-3', 'depth' => '3' ),
array( 'name' => 'Root_2', 'depth' => '1' ),
array( 'name' => 'Children 2-1', 'depth' => '2' ),
array( 'name' => 'Children 2-2', 'depth' => '2' ),
array( 'name' => 'Children 2-3', 'depth' => '2' ),
array( 'name' => 'Children 2-3-1', 'depth' => '3' ),
array( 'name' => 'Children 2-3-2', 'depth' => '3' ),
array( 'name' => 'Children 2-3-3', 'depth' => '3' ),
);
function getChildren( $array, $index = - 1 ) {
$depth = isset( $array[ $index ]['depth'] ) ? (int) $array[ $index ]['depth'] : 0;
$limit = $index === - 1 ? count( $array ) - 1 : findLimit( $array, $index );
$result = array_filter( $array, function ( $item, $key ) use ( $index, $depth, $limit ) {
$isDeeper = (int) $item['depth'] === $depth + 1;
$isAfter = $key > $index;
$isBeforeLimit = $key <= $limit;
return $isDeeper && $isAfter && $isBeforeLimit;
}, ARRAY_FILTER_USE_BOTH );
foreach ( $result as $key => $item ) {
$result[ $key ]['children'] = getChildren( $array, $key );
}
return $result;
}
function findLimit( $array, $index ) {
$depth = (int) $array[ $index ]['depth'];
$limit = $index;
$current = $limit + 1;
while ( isset( $array[ $current ] ) && ( (int) $array[ $current ]['depth'] > $depth ) ) {
$current ++;
$limit ++;
}
return $limit;
}
$result = getChildren( $array );
var_dump( $result );
結果:
array(2) {
[0]=>
array(3) {
["name"]=>
string(6) "Root_1"
["depth"]=>
string(1) "1"
["children"]=>
array(3) {
[1]=>
array(3) {
["name"]=>
string(12) "Children 1-1"
["depth"]=>
string(1) "2"
["children"]=>
array(0) {
}
}
[2]=>
array(3) {
["name"]=>
string(12) "Children 1-2"
["depth"]=>
string(1) "2"
["children"]=>
array(1) {
[3]=>
array(3) {
["name"]=>
string(14) "Children 1-2-1"
["depth"]=>
string(1) "3"
["children"]=>
array(0) {
}
}
}
}
[4]=>
array(3) {
["name"]=>
string(12) "Children 1-3"
["depth"]=>
string(1) "2"
["children"]=>
array(3) {
[5]=>
array(3) {
["name"]=>
string(14) "Children 1-3-1"
["depth"]=>
string(1) "3"
["children"]=>
array(0) {
}
}
[6]=>
array(3) {
["name"]=>
string(14) "Children 1-3-2"
["depth"]=>
string(1) "3"
["children"]=>
array(0) {
}
}
[7]=>
array(3) {
["name"]=>
string(14) "Children 1-3-3"
["depth"]=>
string(1) "3"
["children"]=>
array(0) {
}
}
}
}
}
}
[8]=>
array(3) {
["name"]=>
string(6) "Root_2"
["depth"]=>
string(1) "1"
["children"]=>
array(3) {
[9]=>
array(3) {
["name"]=>
string(12) "Children 2-1"
["depth"]=>
string(1) "2"
["children"]=>
array(0) {
}
}
[10]=>
array(3) {
["name"]=>
string(12) "Children 2-2"
["depth"]=>
string(1) "2"
["children"]=>
array(0) {
}
}
[11]=>
array(3) {
["name"]=>
string(12) "Children 2-3"
["depth"]=>
string(1) "2"
["children"]=>
array(3) {
[12]=>
array(3) {
["name"]=>
string(14) "Children 2-3-1"
["depth"]=>
string(1) "3"
["children"]=>
array(0) {
}
}
[13]=>
array(3) {
["name"]=>
string(14) "Children 2-3-2"
["depth"]=>
string(1) "3"
["children"]=>
array(0) {
}
}
[14]=>
array(3) {
["name"]=>
string(14) "Children 2-3-3"
["depth"]=>
string(1) "3"
["children"]=>
array(0) {
}
}
}
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.