来自 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 有时与objectIdvisibleOn、...处于同一级别,并且可以采用不同的值

所以,我打算做的是从$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 响应的条件未设置的主要内容,如果未能解决你的问题,请参考以下文章

无法设置 Guzzle 内容类型

是否可以通过 HTTP/2 设置 Guzzle + Pool?

JAX-RS Cookie 响应未显示在浏览器中

Laravel 5.6模拟Guzzle响应

php Guzzle HTTP将ssl验证设置为false

Guzzle 6:不再有响应的 json() 方法