【问题标题】:How to get a nested array to a collection in Laravel如何将嵌套数组获取到 Laravel 中的集合
【发布时间】:2018-10-10 18:49:18
【问题描述】:

我有一个来自 api 的响应,它返回如下内容:

array:162 [▼
"WAN" => array:4 [▼
"available" => "1153.65000000"
"onOrder" => "0.00000000"
"btcValue" => "1.05385928"
"btcTotal" => "1.05385928"
 ]
"ONT" => array:4 [▼
"available" => "961.95000000"
"onOrder" => "0.00000000"
"btcValue" => "0.83237534"
"btcTotal" => "0.83237534"
]
"NCASH" => array:4 [▼
"available" => "114194.00000000"
"onOrder" => "0.00000000"
"btcValue" => "0.59495074"
"btcTotal" => "0.59495074"
]
....

这一切都很好而且很花哨,但是我更喜欢使用收集方法。

我已经尝试使用 collect() 方法转换为集合。

$collection = collect($returned, true);

但是我仍然无法像这样遍历数据:

$collection->WAN->available

相反,我在 $results 中得到以下信息:

Collection {#408 ▼
#items: array:162 [▼
"WAN" => array:4 [▼
  "available" => "1153.65000000"
  "onOrder" => "0.00000000"
  "btcValue" => "1.05085979"
  "btcTotal" => "1.05085979"
]
"ONT" => array:4 [▼
  "available" => "961.95000000"
  "onOrder" => "0.00000000"
  "btcValue" => "0.83170197"
  "btcTotal" => "0.83170197"
]
"NCASH" => array:4 [▼
  "available" => "114194.00000000"
  "onOrder" => "0.00000000"
  "btcValue" => "0.59951850"
  "btcTotal" => "0.59951850"
]
....

所以经过大量的嘲笑后,我发现了这个:

$results = json_encode($returned);
$results = json_decode($results);

$collection = collect($results, true);

事实证明这是朝着正确方向迈出的一步,但我仍然无法以完整的集合样式遍历数据。

我现在收到以下回复:

 Collection {#572 ▼
 #items: array:162 [▼
 "WAN" => {#409 ▼
  +"available": "1153.65000000"
  +"onOrder": "0.00000000"
  +"btcValue": "1.05270563"
  +"btcTotal": "1.05270563"
 }
 "ONT" => {#411 ▼
  +"available": "961.95000000"
  +"onOrder": "0.00000000"
  +"btcValue": "0.81842706"
  +"btcTotal": "0.81842706"
 }
 "NCASH" => {#412 ▼
  +"available": "114194.00000000"
  +"onOrder": "0.00000000"
  +"btcValue": "0.60294432"
  +"btcTotal": "0.60294432"
 }

我可以这样遍历:

$collection['WAN']->available

我怎样才能做到:

$collection->WAN->available

我现在已经没有想法了,我似乎找不到任何可以解决这个问题的方法。

有什么想法吗?

提前致谢。

【问题讨论】:

  • 它必须是 Laravel 集合吗?我不认为你可以这样做 $collection->property,但是,如果你想拥有它,你可以将它完全转换为 StdClass

标签: php arrays laravel collections


【解决方案1】:

Collection 只是一个数组的包装器。您的 collect 调用返回了正确的集合表示,但您正在混合对象和数组语法。像$collection->WAN 这样的操作不是试图在名为“collection”的数组中获取“WAN”的值,而是试图获取名为“collection”的对象中的属性值。 Collection 应该基于数组,所以 $collection->WAN 不应该工作。

您使用 JSON 函数的尝试有效,因为当您使用 json_decode() 解码 JSON 时,默认情况下它会将其解码为一个对象,并且您将使用第二个可选参数(如 json_decode($json, true))将其解码为关联数组。

如果您只是想使用“收集方法”,我假设它类似于$collection->sum('available') 或类似的东西,那么您的两种方法中的任何一种都可以工作,尽管第一种可能会更快。您只需要确保不要将数组表示法 ($collection["WAN"]) 与对象表示法 ($collection->WAN) 混合使用。

【讨论】:

  • 感谢您的解释,我对此很陌生,因此我缺乏理解。所以你基本上是说我无法实现我认为可能的目标,并且需要深入研究以了解基本原理? :)
  • @madmatuk 您可以将 Laravel 集合方法与您拥有的数组一起使用,只是不要使用 ->,因为它是对象表示法并且您没有对象。对象不像数组那样容易遍历,因此您应该使用数组([] 语法)。您可能确实需要更多地了解基础知识。
猜你喜欢
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多