递归cURL函数php

时间:2018-08-08 07:39:19

标签: php arrays

我在使用 php 函数时遇到问题,它是一个递归函数-似乎可以正常工作,因为如果我转储数组,我会看到项目已添加到数组中。但是,当我想返回数组时,会得到一个'function' object has no attribute '__getitem__'

api函数是一个null包装函数,可以处理api调用-可以正常工作,http curl的{​​{1}}项也可以被填充-但返回不会返回数组-如果我$arr的结果得到一个db_address,如果我var_dump的结果得到一个Null

print_r

我在这里做错什么了吗?我看不到我在做什么错..

4 个答案:

答案 0 :(得分:0)

您需要创建全局变量并将下一个数组合并到其中

function get_all_db_addresses($skip)
{
    if(!isset($skip)){
        $skip = 0;
    }
    $db_addresses = json_decode(db_api('GET', 'DbAddress?$skip=' . $skip), true);

    $arr = array();
    if(!array_key_exists('@odata.nextLink', $db_addresses)){
        $arr = array_merge($arr, $db_addresses['value']);
    } else {
        $skip += 20;
        $arr = array_merge($db_addresses['value'], get_all_db_addresses($skip));
    }
    return $arr;

}

不确定,但是有可能因为我无法测试您的数据而起作用

答案 1 :(得分:0)

尝试一下:

function get_all_db_addresses($arr = [], $skip = 0){
    $db_addresses = json_decode(db_api('GET', 'DbAddress?$skip=' . $skip), true);
    $arr = array_merge($arr, $db_addresses['value']);
    if(!array_key_exists('@odata.nextLink', $db_addresses)){
        return $arr;
    } else {
        $skip += 20;
        return get_all_db_addresses($arr, $skip);
    }
}

您必须为递归调用添加返回语句。 提示:不要检查是否设置了参数-为其设置默认值。

答案 2 :(得分:0)

您有2个问题:

  1. 执行递归调用时没有return语句
  2. 如果您使用null执行array_merge,您将得到null

检查:

function get_all_db_addresses($arr = array(), $skip = 0)
{
    $db_addresses = json_decode(db_api('GET', 'DbAddress?$skip=' . $skip), true);
    if (isset($db_addresses['value'])) {
        $arr = array_merge($arr, $db_addresses['value']);
    }
    if (array_key_exists('@odata.nextLink', $db_addresses)) {
        return get_all_db_addresses($arr, $skip + 20);
    }
    return $arr;
}

答案 3 :(得分:0)

您的代码中的问题:

  1. 如果要更改参数References Explained的值,应将函数参数传递给引用。
  2. 如果您希望函数返回值,则应始终返回一个值(具有指定的类型)。
  3. 可以在新的PHP版本中直接设置默认参数值,但这不会破坏您的代码,而只是破坏编码样式。

解决方案:

应该对此功能进行修改以使其正常工作(未经测试):

function &get_all_db_addresses(&$arr = [], $skip = 0) {
    // ...
    if(array_key_exists('@odata.nextLink', $db_addresses)){
        get_all_db_addresses($arr, $skip + 20);
    }
    return $arr;
}