2017-05-25 26 views
1

我有这样一段代码:问题与Laravel 5.4,其中收集方法

if ($response && $response->getStatusCode() == 200) { 
     $this->ticker = collect(collect(json_decode($response->getBody()->getContents(), true))->get('payload')); 

     Log::info(json_encode($this->ticker)); 

     switch ($book): 
      case 'btc_mxn': 
       return $this->ticker->whereStrict('book', 'btc_mxn'); 
      case 'eth_mxn': 
       return $this->ticker->whereStrict('book', 'eth_mxn'); 
      case 'all':  
       return $this->ticker; 
      default: 
       throw new ValidationHttpException(['Invalid book (9002)']); 
     endswitch; 
    } 

的$响应部分并不重要,只有$这个 - >股票部分。这会得到一个包含对象数组的API响应。 对象包含我关心的书籍字段。将JSON看起来是这样的:

[{"high":"59999.00","last":"53021.11","created_at":"2017-05-25T23:16:44+00:00","book":"btc_mxn","volume":"1313.28966742","vwap":"55354.76622471","low":"50000.00","ask":"53998.92","bid":"53021.11"},{"high":"4699.00","last":"4102.00","created_at":"2017-05-25T23:16:44+00:00","book":"eth_mxn","volume":"7162.16835199","vwap":"4322.60134630","low":"3900.00","ask":"4102.00","bid":"4100.00"},{"high":"0.00012498","last":"0.00010700","created_at":"2017-05-25T23:16:44+00:00","book":"xrp_btc","volume":"17584.07258163","vwap":"0.00010897","low":"0.00009500","ask":"0.00011990","bid":"0.00010100"},{"high":"7.10","last":"6.05","created_at":"2017-05-25T23:16:44+00:00","book":"xrp_mxn","volume":"1015137.88406527","vwap":"6.28004670","low":"5.50","ask":"6.05","bid":"5.85"},{"high":"0.08197000","last":"0.07800000","created_at":"2017-05-25T23:16:44+00:00","book":"eth_btc","volume":"73.29999906","vwap":"0.07656212","low":"0.07250000","ask":"0.07800000","bid":"0.07600000"}] 

问题是当我切换$书。如果$书= 'btc_mxn' 我得到的对象数组:

[ 
    { 
    "high": "59999.00", 
    "last": "53000.00", 
    "created_at": "2017-05-25T23:23:29+00:00", 
    "book": "btc_mxn", 
    "volume": "1316.43950673", 
    "vwap": "55323.60047189", 
    "low": "50000.00", 
    "ask": "53000.00", 
    "bid": "52001.00" 
    } 
] 

但是,如果$书= 'eth_mxn' 我得到一个对象!

{ 
    "1": { 
    "high": "4699.00", 
    "last": "4025.97", 
    "created_at": "2017-05-25T23:24:18+00:00", 
    "book": "eth_mxn", 
    "volume": "7360.11920724", 
    "vwap": "4310.48584845", 
    "low": "3900.00", 
    "ask": "4026.00", 
    "bid": "4000.01" 
    } 
} 

同样的情况几乎到这是不是“btc_mxn”其他书的关键。

我通过向first()方法添加一个调用来解决这个问题,但这很奇怪。有人对这里发生的事情有任何想法吗?

谢谢。

+0

这个问题/答案是有关:https://stackoverflow.com/questions/36231077/laravel-eloquent-toarray-not-using-square-braces/ 36232302#36232302 – patricus

回答

1

书“btc_mxn”是第一本在集合中,与0的指数所以,你where结果看起来类似:

[ 
    0 => { /* book data */ } 
] 

在JSON,这是一个正确的数字索引数组,因此它被表示为一个元素的数组。

但书“eth_mxn”是第二本书您的收藏中,以1为指数所以,你where结果看起来类似:

[ 
    1 => { /* book data */ } 
] 

在JSON,这不是一个正确的数字索引数组,因为索引数组必须具有从索引0开始的连续键。由于这不是有效的json数组,因此它被表示为数字键属于对象的对象。

如果您希望将其作为数组表示,您需要重新键入where()调用的结果集合。您可以使用values()方法重新键入结果:

case 'btc_mxn': 
    return $this->ticker->whereStrict('book', 'btc_mxn')->values(); 
case 'eth_mxn': 
    return $this->ticker->whereStrict('book', 'eth_mxn')->values(); 
+0

非常有意义。非常感谢你。 – Jonathan