繁体   English   中英

如何通过PHP中的键值从数组对象中获取数组项

[英]How to get array items from array object by key value in php

我有下面的对象数组:

$ARR =[
{"id":55,"timetable_id":1,"day":"Sat","checkin":"07:00:00","checkout":"11:00:00","isActive":1,"created_at":"2017-12-28 19:40:23","updated_at":"2017-12-28 19:40:23"},
{"id":54,"timetable_id":1,"day":"Fri","checkin":"07:00:00","checkout":"11:00:00","isActive":1,"created_at":"2017-12-28 19:40:23","updated_at":"2017-12-28 19:40:23"},
{"id":53,"timetable_id":1,"day":"Thu","checkin":"07:00:00","checkout":"11:00:00","isActive":1,"created_at":"2017-12-28 19:40:23","updated_at":"2017-12-28 19:40:23"},
{"id":52,"timetable_id":1,"day":"Wed","checkin":"07:00:00","checkout":"11:00:00","isActive":1,"created_at":"2017-12-28 19:40:23","updated_at":"2017-12-28 19:40:23"},
{"id":51,"timetable_id":1,"day":"Tue","checkin":"14:00:00","checkout":"17:00:00","isActive":1,"created_at":"2017-12-28 19:40:23","updated_at":"2017-12-28 19:40:23"},
{"id":50,"timetable_id":1,"day":"Tue","checkin":"07:00:00","checkout":"11:00:00","isActive":1,"created_at":"2017-12-28 19:40:23","updated_at":"2017-12-28 19:40:23"},
{"id":49,"timetable_id":1,"day":"Mon","checkin":"14:00:00","checkout":"16:00:00","isActive":1,"created_at":"2017-12-28 19:40:23","updated_at":"2017-12-28 19:40:23"},
{"id":48,"timetable_id":1,"day":"Mon","checkin":"07:00:00","checkout":"11:00:00","isActive":1,"created_at":"2017-12-28 19:40:23","updated_at":"2017-12-28 19:40:23"}
];

我想通过特定的键值获取任何数组项。 例如,我想获取关键day等于Tue ,因此我的数组结果将如下所示:

$RESULTS=[
    {"id":51,"timetable_id":1,"day":"Tue","checkin":"14:00:00","checkout":"17:00:00","isActive":1,"created_at":"2017-12-28 19:40:23","updated_at":"2017-12-28 19:40:23"},
    {"id":50,"timetable_id":1,"day":"Tue","checkin":"07:00:00","checkout":"11:00:00","isActive":1,"created_at":"2017-12-28 19:40:23","updated_at":"2017-12-28 19:40:23"},
    ];

我试过的

$RESULTS = [];
foreach($ARR as $item){
   if($item->day == 'Tue'){
     $RESULTS[] = $item;
   }
}

从技术上讲,它可以按预期工作,但是需要编写许多行代码。 还有其他支持该操作的PHP函数吗? 我尝试了array_slicearray_search但没有运气。

您的实现绝对没有错。 我能想到的唯一其他选择是array_filter

$RESULTS = array_filter($ARR, function($item) {
    return $item->day === 'Tue';
});

但是,您的原始方法很有可能比此方法更具性能 ,尤其是在如此小的阵列中。

还要注意,键是由array_filter保留的,因此最终会得到索引4和5。可以使用array_values重新索引数组。

$RESULTS = array_values($RESULTS);

有几种方法可以执行此操作,但是:如果您需要多次执行相同的操作,则需要一个函数:

function pluck(array $ARR, $key, $value) {
    $RESULTS = [];
    foreach ($ARR as $item){
        if ($item->$key == $value) {
            $RESULTS[] = $item;
        }
    }
    return $RESULTS;
}

您可以将其称为:

$RESULTS = pluck($ARR, 'day', 'Tue');
$RESULTS = pluck($ARR, 'isActive', 1);
// etc...

根据需要多次,而无需所有重复的代码。 也就是说,当然,您可能不需要严格的==比较,在这种情况下,您可能会选择更灵活的函数。 例如, $value可能是一个正则表达式,并且您的函数可以进行如下修改:

        if (preg_match($value, $item->$key) {

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM