【问题标题】:Why is my variable variable not referencing the json data?为什么我的变量变量没有引用 json 数据?
【发布时间】:2017-12-21 23:22:35
【问题描述】:

我一直试图理解和解决这个问题。我想我很接近,因为我怀疑我只是错误地引用了我的 json 数据,但我不知道如何正确地做到这一点。这是用例。

我正在构建一个简单的分类帐系统来跟踪加密交易。该系统还对硬币总数进行了一些很好的统计,以美元计算硬币价值,并计算整体投资组合价值等。

我让用户跟踪他们选择的硬币,这些硬币位于一个名为 $coins 的数组中。 $coins 数组之前在我的代码中通过数据库调用进行了初始化,其中包含 $coin->ID 和 $coin->symbol。

为了确定美元的硬币价值,我使用他们的 API 调用 CryptoCompare,在从我的 $coins 数组中获取硬币符号后,它看起来像这样:

https://min-api.cryptocompare.com/data/pricemulti?fsyms=ADA,BTC,ETH,LTC&tsyms=USD

只需将该 URL 弹出到浏览器中以设置 view the results。

$price_request_data 在解码后存储该数据。

现在,当我尝试通过我的 $coins 循环引用 JSON 数据时,我的问题就出现了。如果我使用直接引用,我可以很好地引用数据,例如:

$price_request_data->BTC->USD

产生的值为 15592。

但显然我想循环通过我的 $coins 循环并为每个硬币动态创建变量以保持其各自的价格。当我尝试以这种方式引用 JSON 数据时,它无法检索价格(15592)而是返回 0。

        // ----------------------------------------------------------
        // GET CURRENT PRICES

        $apiurl = "https://min-api.cryptocompare.com/data/pricemulti?fsyms=ADA,BTC,ETH,LTC&tsyms=USD";

        $price_request = wp_remote_get( $apiurl );

        if( is_wp_error( $price_request ) ) {
            return false;
        }

        $price_request_body = wp_remote_retrieve_body( $price_request );

        $price_request_data = json_decode( $price_request_body );

        if( ! empty( $price_request_data ) ) {

            echo $price_request_data->BTC->USD . "<br />"; // PRODUCES 15592

            foreach( $coins as $coin ) {

                $pricereqdata = "price_request_data->" . $coin->symbol . "->USD";

                echo $$pricereqdata; // PRODUCES 0

                // Generate the variable name string i.e. "curpricebtc"
                $curprice = "curprice" . strtolower( $coin->symbol );

                // Format the current coin's price
                $$curprice = number_format( ceil_dec( $$pricereqdata, 2 ), 2, ".", "" );


            }

        }

这是 $price_request_data 的 vardump:

object(stdClass)#1527 (4) {
  ["ADA"]=>
  object(stdClass)#1528 (1) {
    ["USD"]=>
    float(0.4469)
  }
  ["BTC"]=>
  object(stdClass)#1535 (1) {
    ["USD"]=>
    float(15592)
  }
  ["ETH"]=>
  object(stdClass)#1536 (1) {
    ["USD"]=>
    float(757.13)
  }
  ["LTC"]=>
  object(stdClass)#1539 (1) {
    ["USD"]=>
    float(291.21)
  }
}

我正在使用 PHP7,并且我知道一些参考规则已更改,但我无法确定这是否是我的问题。我发誓这只是我用变量引用它的方式,但我没有足够的经验知道为什么。

非常感谢任何智慧。

【问题讨论】:

  • 你不能使用字符串作为链。
  • 好吧,我想我明白你的意思了......你是说你不能像我那样生成一个链( $price_request_data->BTC​​->USD )“price_request_data-> ” 。 $硬币->符号。 “->美元”。换句话说,您不能使用字符串组装链条。那么问题来了,如果没有硬编码 1500 个“链”,您如何参考 JSON 价格?
  • $pricereqdata = $price_request_data-&gt;{$coin-&gt;symbol}-&gt;USD; echo $pricereqdata; 应该可以工作。
  • 假期延迟,但我会尝试确认。

标签: php json dynamic-variables


【解决方案1】:

好的:

问:“$price_request_data”是否等于{"ADA":{"USD":0.4738},"BTC":{"USD":15486.46},"ETH":{"USD":786.47},"LTC":{"USD":306.48}}(或等价物)?

问:“$coin”在哪里初始化?它的价值是什么?

问:“$pricereqdata”的值是多少?

问:“$$pricereqdata”会为您创建一个新变量吗?它是什么?它的价值是什么?

换句话说,“// FAILS”到底是什么意思???

【讨论】:

  • 好的,我编辑了我的代码以使事情更清晰,我想我这样做回答了你所有的问题。 $pricereqdata 包含字符串“price_request_data->BTC​​->USD”,其中 BTC 在您遍历 $coins 时会发生变化。 $$pricereqdata 应该产生 15592 的值,但不会。它返回 0。
  • 请看上面 Jon Stirling 的回复:$pricereqdata = $price_request_data-&gt;{$coin-&gt;symbol}-&gt;USD; echo $pricereqdata; 请告诉我们您是如何解决问题的。
猜你喜欢
  • 2022-12-06
  • 2020-11-05
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多