【问题标题】:Array key exists in multidimensional array数组键存在于多维数组中
【发布时间】:2012-04-23 19:50:27
【问题描述】:

我正在尝试将一组页面排列到一个数组中,并根据它们的父 ID 号放置它们。如果父 id 为 0,我希望将其作为数组放置在数组中......

$get_pages = 'DATABASE QUERY'
$sorted = array()

foreach($get_pages as $k => $obj) {
    if(!$obj->parent_id) {
        $sorted[$obj->parent_id] = array();
    }
}

但是如果设置了父 ID,我想将它放入相关的数组中,再次像这样的数组......

$get_pages = 'DATABASE QUERY'
$sorted = array()

foreach($get_pages as $k => $obj) {
    if(!$obj->parent_id) {
        $sorted[$obj->id] = array();
    } else if($obj->parent_id) {
        $sorted[$obj->parent_id][$obj->id] = array();
    }
}

这是我开始遇到问题的地方。如果我有第 3 个元素需要插入到数组的第 2 维,或者甚至第 4 元素需要插入第 3 维,我无法检查该数组键是否存在。所以我想不通的是如何检测数组键是否存在于第一个维度之后,如果它存在于它所在的位置,那么我可以放置新元素。

这是我的数据库表的示例

id    page_name    parent_id

1     Products             0
2     Chairs               1
3     Tables               1
4     Green Chairs         2
5     Large Green Chair    4
6     About Us             0

这是我想要获得的输出示例,如果有更好的方法可以做到这一点,我愿意提供建议。

Array([1]=>Array([2] => Array([4] => Array([5] => Array())), [3] => Array()), 6 => Array())

提前致谢!

【问题讨论】:

    标签: php arrays multidimensional-array array-key-exists


    【解决方案1】:

    嗯,基本上你是在建造一棵树,所以其中一种方法是使用recursion

    // This function takes an array for a certain level and inserts all of the 
    // child nodes into it (then going to build each child node as a parent for
    // its respective children):
    
    function addChildren( &$get_pages, &$parentArr, $parentId = 0 )
    {
        foreach ( $get_pages as $page )
        {
            // Is the current node a child of the parent we are currently populating?
    
            if ( $page->parent_id == $parentId )
            {
                // Is there an array for the current parent?
    
                if ( !isset( $parentArr[ $page->id ] ) )
                {
                    // Nop, create one so the current parent's children can
                    // be inserted into it.
    
                    $parentArr[ $page->id ] = array();
                }
    
                // Call the function from within itself to populate the next level
                // in the array:
    
                addChildren( $get_pages, $parentArr[ $page->id ], $page->id );
            }
        }
    }
    
    
    $result = array();
    addChildren( $get_pages, $result );
    
    print_r($result);
    

    这不是最有效的方法,但对于少数页面和层次结构,你应该没问题。

    【讨论】:

    • 谢谢!我会试一试。我怎样才能提高效率?
    • 工作就像一个魅力,谢谢!不过,我不得不将 !is_array 更改为 isset
    猜你喜欢
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2021-10-08
    • 2011-09-20
    • 2015-01-06
    • 2011-10-22
    相关资源
    最近更新 更多