我有一个PHP数组,我需要基于tlp_queue_manager_schedulers对象中的一个键找到一个项,我尝试执行array_search,但是这返回了false,我还尝试将这个方法与array_column组合
[
{
"tlp_queue_manager_schedulers":{
"id":"1",
"token":"ABC"
},
"0":{
"num":"1"
}
},
{
"tlp_queue_manager_schedulers":{
"id":"3",
"token":"cron-3"
},
"0":{
"num":"2"
}
},
{
"tlp_queue_manager_schedulers":{
"id":"4",
"token":"CronA75nvAgjsm8b"
},
"0":{
"num":"3"
}
},
{
"tlp_queue_manager_schedulers":{
"id":"2",
"token":"XYZ"
},
"0":{
"num":"4"
}
}
]例如,我需要返回id键与3匹配的数组项,然后返回:
{
"tlp_queue_manager_schedulers":{
"id":"3",
"token":"cron-3"
},
"0":{
"num":"2"
}
}发布于 2022-04-29 16:05:50
foreach循环很好。没有什么比foreach循环更好了:
$matchingObject = null;
foreach($array as $obj)
{
if($obj->tlp_queue_manager_schedulers->id == "3")
{
$matchingObject = $obj;
break;
}
}发布于 2022-04-30 08:23:30
虽然@Quasipickle的foreach循环也是我的主要修复方法,但由于我们有一个“简短的挑战”与Javascript的array.find()方法相比,这里有一个带有array_filter的PHP liner
$matches = array_filter($data,
fn($row) => $row['tlp_queue_manager_schedulers']['id'] == '3'
);给出样本数据后,返回:
array(1) {
[1] · array(2) {
["tlp_queue_manager_schedulers"] · array(2) {
["id"] · string(1) "3"
["token"] · string(6) "cron-3"
}
[0] · array(1) {
["num"] · string(1) "2"
}
}
}请注意,这将返回一个数组,其所有项都与条件匹配(保留原始索引)。如果没有找到匹配项,则返回一个空数组。如果您只对第一次匹配感兴趣,那么$match = current($matches); (没有匹配:false)或$match = array_shift($matches); (没有匹配:null)会给出这个结果。
如果您有一个很大的数据集,并且只关心查找第一个匹配项,那么在匹配后找到带有break的break(或者如果您的循环在助手函数中,则可以选择return ),可能会节省大量冗余周期,因为array_filter将检查整个数组直到结束(对于小型数据集来说,这种差异将是无关紧要的)。
如果您想知道为什么array_search不能工作:它只查看数组值,则不能指定要检查的键。即使您第一次使用array_column,您的列仍然是一个关联数组。您可以通过这些功能和某种程度的欺骗来完成这一任务,但是这将是一个冗长而复杂的解决方案。最好保持简单干净。
https://stackoverflow.com/questions/72059054
复制相似问题