PHP+Laravel:间接修改Illuminate\Support\Collection的重载元素无效



我正在尝试循环处理一些数据,如果键值对与同一数组中的特定条件匹配,我需要对所有数字字段执行计算。

然而,当我尝试foreach到我需要的级别时,我会得到错误:

间接修改Illuminate\Support\Collection的过载元素对没有影响

这是我拥有的数据:

{
"CLIENT-NAME-1": {
"returns": [
{
"valueType": "absolute return",
"priceDate": "2021-05-31",
"currency": "JPY",
"quarterTDReturn": 260,
"sinceInception": 0.58,
"currencyType": "local",
"returnMethod": "time-weighted",
"grossOrNet": "gross"
}
],
"gainLoss": [
{
"valueType": "gain loss",
"methodology": "Cumulative",
"currency": "JPY",
"fiscalYearToDate": 54584758,
"currencyType": "local",
"type": "total"
}
]
},
"CLIENT-NAME-2": {
"returns": [
{
"valueType": "absolute return",
"priceDate": "2021-05-31",
"currency": "JPY",
"quarterTDReturn": 2.6e+94,
"currencyType": "local",
"returnMethod": "time-weighted",
"grossOrNet": "gross"
},
{
"valueType": "absolute return",
"priceDate": "2020-09-30",
"methodology": "IRR; Gross; Valuated",
"currency": "USD",
"sinceInception": 0.026000000000000002,
"currencyType": "base",
"returnMethod": "IRR",
"grossOrNet": "gross",
"authenticity": "valuated"
},
{
"valueType": "absolute return",
"priceDate": "2020-09-30",
"methodology": "IRR; Net; Valuated",
"currency": "USD",
"sinceInception": 0.026000000000000002,
"currencyType": "base",
"returnMethod": "IRR",
"grossOrNet": "net",
"authenticity": "valuated"
}
]
}
}

以下是我在出现上述错误时所做的尝试:

foreach ($this->data as $clientReference => $dataGroupsArrays) {
foreach ($dataGroupsArrays['returns'] as $arrKey => $keyValuePair) {
if (($keyValuePair['valueType'] == "absolute return") && ($keyValuePair['returnMethod'] == "time-weighted")) {
foreach ($keyValuePair as $key => $value) {
if(is_numeric($value)) {
$this->data[$clientReference][$arrKey][$key] = $value * 100;
}
}
}
}
}

我看到了一个类似的问题:间接修改Illuminate\Support\Collection的重载元素没有效果,这表明这是因为它是一个集合,所以我应该映射数据而不是

所以我尝试了:

$this->data = $this->data->map(function ($clientReference, $dataGroupsArrays) {
$dataGroupsArrays['returns'] = $dataGroupsArrays['returns']->map(function ($arrKey, $keyValuePair) {
if (($keyValuePair['valueType'] == "absolute return") && ($keyValuePair['returnMethod'] == "time-weighted")) {

$keyValuePair = $keyValuePair->map(function($key, $value) {
if(is_numeric($value)) {
return $value * 100;
}
});


}
}
});

但后来我得到了错误:

非法字符串偏移量"返回">

如何循环处理此数据,如果['valueType'] == "absolute return"['returnMethod'] == "time-weighted"将该数组/对象中的所有数值乘以100?

希望它能有所帮助:

$clients = $this->data();
foreach ($clients as $cIndex => $client) {
foreach ($client['returns'] as $rIndex => $return) {
if ($return['valueType'] === "absolute return" &&  $return["returnMethod"] === "time-weighted") {
foreach ($return as $key => $value) {
if (is_numeric($value)) {
$return[$key] = $value * 100;
}
}
$client['returns'][$rIndex] = $return;
}
}
$clients[$cIndex] = $client;
}

如果你喜欢使用地图:

$clients = collect($this->data())
->map(function ($client) {
$client["returns"] = collect($client["returns"])
->map(function ($return) {
if ($return["valueType"] === "absolute return" && $return["returnMethod"] === "time-weighted") {
$return = collect($return)
->map(function ($value) {
return is_numeric($value) ? $value * 100 : $value;
})->toArray();
}
return $return;
})->toArray();
return $client;
})->toArray();

最新更新