【问题标题】:How to get array items from array object by key value in php如何通过php中的键值从数组对象中获取数组项
【发布时间】:2017-12-29 03:31:42
【问题描述】:

我有一个对象数组如下:

$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 但没有运气。

【问题讨论】:

  • 你称之为“多行代码”
  • @Phil 如果 OP 必须针对不同的条件一遍又一遍地重复它,那就是很多行代码。
  • @bishop 我的意思是,你可以将它封装成一个函数(我认为 OP 已经知道了)。如果你真的想要,你也可以把它写成一行~foreach($ARR as $i) if($item->day==='Tue') $RESULTS[]=$item;
  • 有趣的是,我假设 OP 没有考虑函数:担心行数似乎是 X-Y 问题的 Y:“我必须这样做很多次,我不想重复大量代码:我怎样才能在一行中做到这一点”。

标签: php arrays filter


【解决方案1】:

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

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

您的原始方法很有可能是more performant,而不是这个,尤其是在这么小的数组中。

另请注意,键与 array_filter 一起保留,因此您最终会得到索引 4 和 5。您可以使用 array_values 重新索引数组

$RESULTS = array_values($RESULTS);

【讨论】:

  • 哦,希望 PHP 实现短闭包。
  • @bishop 是的。箭头函数/ lambdas 肯定会很好。如果array_* 函数可以在集合上并行工作,那也很好。对于大型数据集,我们实际上可能会看到一些性能优势。
【解决方案2】:

有几种方法可以做到这一点,但是:如果你需要多次做同样的事情,那就需要一个函数:

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) {

【讨论】:

    猜你喜欢
    • 2018-03-29
    • 2019-04-11
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多