>

깊이를 사용하여 배열을 다차원으로 변환하는 함수를 만들기 위해 24 시간 이상 노력해 온 큰 문제가있는 것 같습니다.

내 배열은

$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;

}


  • 답변 # 1

    좋아요. 우리는 재귀 솔루션을 원합니다.

    각 항목 (가상 루트로 시작)에 대해 하위 항목을 검색하려고합니다. 어린이가 아닌모든 것을 걸러내어 어린이를 얻는다고 가정 해 봅시다.

    필터 기준은 무엇입니까?

    <올>

    아이는 부모보다 깊이가 큽니다.

    자녀가 부모보다 색인이 더 큽니다.

    자식은 같은 깊이의 항목 블록에 속합니다. 자식의 색인이 다음 블록의 시작보다 작으므로 이것을 섞습니다. 이 색인을 한도보다 작게 설정하겠습니다.

    그래서 우리는 필요합니다 :

    <올>

    지수, 깊이 및 한계에 대해 자녀를 얻는 기능

    지정된 인덱스에 대한 제한을 얻는 도우미 함수

    내가 끝낸 것은 다음과 같다. 나는 이것이 (내가 막연하게 거기에 내 제한 논리를 의심) 완벽하다 생각하지 않는다, 그러나 당신의 예제 데이터를 주로있다.

    $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) {
                }
              }
            }
          }
        }
      }
    }
    
    
    

  • 답변 # 2

    조금 늦었지만 비 재귀 솔루션에 관심이있는 경우 간단한one-pass-only루프 (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

  • 이전 profiling - cuda - 왜 많은 양의 gpu 유휴 시간이 있습니까?
  • 다음 하이퍼 레저 작성기 도구에서 개인 네트워크를 만드는 방법