来自 Guzzle 响应的条件未设置
Posted
技术标签:
【中文标题】来自 Guzzle 响应的条件未设置【英文标题】:Conditional unset from Guzzle response 【发布时间】:2021-06-18 23:27:24 【问题描述】:我看到了一些问题和值得参考的问题
How can i delete object from json file with php based on ID How do you remove an array element in a foreach loop? How to delete object from array inside foreach loop? Unset not working in multiple foreach statements (PHP)列表中的最后两个更接近我的意图。
我有一个变量名 $rooms
,它使用 Guzzle 存储来自特定 API 的数据
$rooms = Http::post(...);
如果我这样做
$rooms = json_decode($rooms);
这就是我得到的
如果我这样做
$rooms = json_decode($rooms, true);
这就是我得到的
现在group
有时与objectId
、visibleOn
、...处于同一级别,并且可以采用不同的值
所以,我打算做的是从$rooms
删除
group
未设置(例如,必须删除特定值)
group
没有值bananas
。
灵感来自最初列表中的最后两个问题
foreach($rooms as $k1 => $room_list)
foreach($room_list as $k2 => $room)
if(isset($room['group']))
if($room['group'] != "bananas")
unset($rooms[$k1][$k2]);
else
unset($rooms[$k1][$k2]);
请注意,$room['group']
需要更改为 $room->group
,具体取决于我们是否在 json_decode()
中传递了 true
。
这是我在上一个代码块之后dd($rooms);
得到的输出
相反,我希望得到与之前在 $rooms = json_decode($rooms);
中显示的结果相同的结果,不同之处在于它不会提供 100 条记录,而是只提供符合两个所需条件的记录。
【问题讨论】:
所以,基本上你只想要if( !isset($room['group']) || $room['group'] != "bananas" )
...?
@CBroe 对,这样可以简化条件。但问题不在于逻辑,而在于输出
我在您展示的任何这些屏幕截图中都没有看到group
,那么我们现在应该如何判断出了什么问题呢?请提供正确的minimal reproducible example 问题。
@CBroe 刚刚包含了一个带有组的案例的图像
您是否尝试将其更改为 laravel 提供的集合而不是从对象转换为数组,然后使用忘记方法
【参考方案1】:
如果我没有完全错,那么这应该对你有用:
$rooms = json_decode($rooms);
$rooms->results = array_values(array_filter($rooms->results, function($room)
return property_exists($room, 'group') && $room->group != "banana";
));
这是上面这个版本的详细和注释版本:
$rooms = json_decode($rooms);
// first lets filter our set of data
$filteredRooms = array_filter($rooms->results, function($room)
// add your criteria for a valid room entry
return
property_exists($room, 'group') // the property group exists
&& $room->group == "banana"; // and its 'banana'
);
// If you want to keep the index of the entry just remove the next line
$filteredRooms = array_values($filteredRooms);
// overwrite the original results with the filtered set
$rooms->results = $filteredRooms;
【讨论】:
以上是关于来自 Guzzle 响应的条件未设置的主要内容,如果未能解决你的问题,请参考以下文章