Php递归函数返回数组结果
我在理解PHP中的递归函数时遇到问题 我想检索所有更新旧服务的服务,从旧ID(服务)开始。返回数组结果 例如我的桌子服务Php递归函数返回数组结果,php,Php,我在理解PHP中的递归函数时遇到问题 我想检索所有更新旧服务的服务,从旧ID(服务)开始。返回数组结果 例如我的桌子服务 ID | Name | DateExpire |IDOldServiceRenewed| ----------------------------------------------- 1 | Serv1 | 2018-10-10 | | ---------------------------------------------
ID | Name | DateExpire |IDOldServiceRenewed|
-----------------------------------------------
1 | Serv1 | 2018-10-10 | |
-----------------------------------------------
2 | Serv2 | 2018-10-11 | |
-----------------------------------------------
3 | Serv3 | 2018-10-12 | 2 |
-----------------------------------------------
4 | Serv4 | 2018-10-13 | 3 |
-----------------------------------------------
5 | Serv5 | 2018-10-14 | 1 |
-----------------------------------------------
6 | Serv6 | 2018-10-15 | |
-----------------------------------------------
7 | Serv7 | 2019-02-10 | 4 |
-----------------------------------------------
8 | Serv8 | 2019-05-15 | 5 |
-----------------------------------------------
因此,在我的示例中,如果我想知道ID=2
的旧服务的所有新服务(以便从旧服务更新到新服务),我希望返回如下数组:
$result = array(
"0" => array(
"ID" => 3,
"Expired" => 2018-10-12
),
"1" => array(
"ID" => 4,
"Expired" => 2018-10-13
),
"2" => array(
"ID" => 7,
"Expired" => 2019-02-10
)
)
array(
1 => array( "id" => ... , "expired" => ...),
2 => array( 1 => array( "id" => ... , "expired" => ...) )
)
对于ID=1
:
$result = array(
"0" => array(
"ID" => 5,
"Expired" => 2018-10-14
),
"1" => array(
"ID" => 8,
"Expired" => 2019-05-15
)
)
我试着从这样的函数开始,但在var_dump中总是得到NULL:
function get_recursive_id_services($idOldService, &$result) {
$sql = "SELECT SERVICES.* FROM SERVICES WHERE IDOldServiceRenewed = ?";
$s = $db->prepare($sql);
$s->execute(array($idOldService));
$ris = $s->fetch(PDO::FETCH_ASSOC);
if ( $ris ) {
$id= $ris['ID'];
$result[$idOldService] = $id;
$result[] = get_recursive_id_services($id, $result);
} else {
return $result;
}
}
// TEST
$temp = array();
$result = get_recursive_id_services(2, $temp);
var_dump($result);
您的代码有一个问题。函数将
$result
参数作为参考。这意味着这一行:
$result[] = get_recursive_id_services($id, $result);
将给出如下内容:
$result = array(
"0" => array(
"ID" => 3,
"Expired" => 2018-10-12
),
"1" => array(
"ID" => 4,
"Expired" => 2018-10-13
),
"2" => array(
"ID" => 7,
"Expired" => 2019-02-10
)
)
array(
1 => array( "id" => ... , "expired" => ...),
2 => array( 1 => array( "id" => ... , "expired" => ...) )
)
你想要的是这个:
return get_recursive_id_services($id, $result);
多亏了@Karol Samborski的建议,我终于成功了
function get_recursive_id_services($id, &$result) {
$sql = "SELECT SERVICES.* FROM SERVICES WHERE IDOldServiceRenewed = ?";
$s = $db->prepare($sql);
$s->execute(array($id));
$ris = $s->fetch(PDO::FETCH_ASSOC);
if ( $ris ) {
$idNewService = $ris['ID'];
$result[] = array("ID" => $idNewService, "DateExpire" => $ris['DateExpire']);
return get_recursive_id_services($idNewService, $result);
} else {
return $result;
}
}
请理解递归。谢谢。如果
$ris
的计算结果有误,为什么不返回任何内容呢?您好,我已经找到了这篇文章,但所有示例都会打印结果。我需要更新一个数组$result以在函数外部使用。您希望结果数组包含子数组,但您在此处将标量值推送到它上,$result[$idOldService]=$id代码>-我认为这没有意义。我认为,通过引用传递和$result
在这里也不必要。函数不需要在自己的作用域之外修改数组,因为它可以在每个递归步骤结束时返回数组的当前状态。