PHP提取大于号的数组?

时间:2016-03-03 08:13:30

标签: php arrays recursion

我的数组看起来像

Array
(
    [0] => Array
        (
            [id] => 1
            [parent_id] => 0
            [title] => Mobiles & Tablets
            [childs] => Array
                (
                    [0] => Array
                        (
                            [id] => 10
                            [parent_id] => 1
                            [title] => Mobile Phone
                        )

                )

        )

    [1] => Array
        (
            [id] => 5
            [parent_id] => 0
            [title] => Mobile Phones
            [childs] => Array
                (
                    [0] => Array
                        (
                            [id] => 2
                            [parent_id] => 5
                            [title] => Moto G
                            [childs] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 3
                                            [parent_id] => 2
                                            [title] => Android
                                        )

                                )

                        )

                    [1] => Array
                        (
                            [id] => 4
                            [parent_id] => 5
                            [title] => Iphone
                        )

                )

        )

    [2] => Array
        (
            [id] => 6
            [parent_id] => 0
            [title] => test
        )

    [3] => Array
        (
            [id] => 7
            [parent_id] => 0
            [title] => Men's Fashion
            [childs] => Array
                (
                    [0] => Array
                        (
                            [id] => 12
                            [parent_id] => 7
                            [title] => Clothing
                            [childs] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 8
                                            [parent_id] => 12
                                            [title] => Jeans
                                        )

                                )

                        )

                )

        )

    [4] => Array
        (
            [id] => 9
            [parent_id] => 0
            [title] => test
        )

)

我为提取数组编写php代码。

public $string = '';
public $result = array();
public function getCategoryListsTree( array $items ){
    $this->createCategoryExtractNode($items);
    echo '<pre>';
    print_r($this->result);
    exit;
}
public function createCategoryExtractNode(array $items)
{
    foreach ($items as $key => $value) {
        $this->string .= $value['title'].' > ';
        if(isset($value['childs'])){
            $this->string .= $this->createCategoryExtractNode($value['childs']);
        }else{
            $this->result[$value['id']] = trim($this->string,' > ');
            $this->string = '';
        }
    }

}

输出

Array
(
    [10] => Mobiles & Tablets > Mobile Phone
    [3] => Mobile Phones > Moto G > Android
    [4] => Iphone
    [6] => test
    [8] => Men's Fashion > Clothing > Jeans
    [9] => test
)

我想输出

Array
(
    [10] => Mobiles & Tablets > Mobile Phone
    [3] => Mobile Phones > Moto G > Android
    [4] => Mobile Phones > Iphone
    [6] => test
    [8] => Men's Fashion > Clothing > Jeans
    [9] => test
)

请帮助

由于

3 个答案:

答案 0 :(得分:2)

Globals是邪恶的,即使它们被包裹在一种花哨的OO风格中。 $string是每个createCategoryExtractNode调用的本地上下文。这样做了:

public $result = array();

public function getCategoryListsTree( array $items ){
    $this->createCategoryExtractNode($items);
    echo '<pre>';
    print_r($this->result);
    exit;
}

public function createCategoryExtractNode(array $items, $carrier='')
{
    foreach ($items as $key => $value) {
        $string = $carrier . $value['title'].' > ';
        if(isset($value['childs'])){
            $this->createCategoryExtractNode($value['childs'], $string);
        }else{
            $this->result[$value['id']] = trim($string,' > ');
        }
    }
}

答案 1 :(得分:0)

您需要在每个时刻保持当前path,因此我们在您的班级定义中添加相应的属性而不是string

public $path = [];

我们在进入时将一个元素推送到path数组,并在最后弹出数组。因此path属性数组保持项目的当前路径。路径项目粘贴在&#39; &GT; &#39;到达叶节点时:

public function createCategoryExtractNode(array $items)
{
    foreach ($items as $key => $value) {
        array_push($this->path, $value['title']);
        if (isset($value['childs'])) {
            $this->string .= $this->createCategoryExtractNode($value['childs']);
        } else {
            $this->result[$value['id']] = implode(' > ', $this->path);
        }
        array_pop($this->path);
    }
}

答案 2 :(得分:0)

这也可以完成工作:

public function createCategoryExtractNode(array $items, $breadcrumbs =  array(), $level = 0)
 {
  foreach ($items as $key => $value) {

        $breadcrumbs[$level] = $value['title'].' > ';

    if(isset($value['childs'])){
        $this->createCategoryExtractNode($value['childs'], $breadcrumbs, $level+1);
    }else{
        $this->string = implode('',$breadcrumbs);
        $this->result[$value['id']] = trim($this->string,' > ');
        $this->string = '';
    }
}
}