如何返回一个由递归得到的数组元素?

时间:2018-03-31 23:14:14

标签: php arrays recursion return element

所以,我有点麻烦: 我有一个类,我们将其命名为“Menu”,同样,我有一个数组,它为“菜单”提供了一个元素,它看起来像那样

class Menu {
    private $_data = [];
    public function __construct() {
            $this->_data = array(
                "Parent1" => array(
                    "Child1" => array(
                        "id" => 1,
                        "minQuantity" => x,
                        "maxQuantity" => x,
                        "cost" => x,
                    ),
                    "Child2"...
                ),
                "ParentX" => array(
                    "ChildXX"...
                )
                /* AND SO ON */
            );
    }
}

另外,在“菜单”中我有一个函数,通过递归尝试找到具有指定值的$ this-> _data的元素,函数看起来像:

public function findChildById($parent = null, $id = null) {
    foreach ($parent as $_parent => $_child) {
        if (array_key_exists($id, $parent)) var_dump($parent);   
        if (is_array($_child)) $this->findChildById($_child, $id); 
    }
}

但是,当它找到所需元素时,我尝试返回它 - 结果总是为NULL。使用var_dump导致明显的输出,我可以看到我需要什么,但我无法从函数返回一个元素。我该怎么办?

1 个答案:

答案 0 :(得分:1)

由于您只尝试查找一个元素,因此将返回值传递给递归堆栈应该足够了。例如。像这样:

public function findChildById($parent = null, $id = null) {
  foreach ($parent as $_parent => $_child) {
    if (array_key_exists($id, $parent)) return $parent; //first return  
    if (is_array($_child)) {
      $tmp = $this->findChildById($_child, $id); 
      if (!is_null($tmp)) return $tmp; //if a deeper step found sth. pass it up
    }
  }
}

你得到NULL的原因必须是,因为当代码没有到达return语句时,PHP函数会隐式返回NULL。