You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP数组过滤:保留含指定子串的键值对失败求助

筛选PHP数组保留指定键值对

原始数组结构:

array(
    [label] => Evening, 
    [hour] => 15,
    [minute] => 00, 
    [add_time] => enabled, 
    [zlzkrrwlwchehhtvdnmq_add_date] => 29 November 2022, 
    [zlzkrrwlwchehhtvdnmq_zoom_id] => null,
    [zlzkrrwlwchehhtvdnmq_stock] => null,
    [sfujorleiwijcczciess_add_date] => 30 November 2022
)

需求:保留数组中键为hour、minute,或键包含add_date的键值对,删除其余内容。

问题原因

之前的代码存在两个核心错误:

  1. 逻辑颠倒:你原本想保留符合条件的键,却在满足条件时执行unset,等于把需要保留的内容主动删除了。
  2. strpos判断错误:strpos($key, 'add_date') == 0仅能匹配以add_date开头的键,但你的add_date键是在字符串末尾,strpos返回的是大于0的位置,导致这个条件不成立;而hour、minute作为完整键名,strpos($key, 'hour') == 0虽然成立,但因为逻辑颠倒,会把这两个键也删掉,最终得到空数组。

解决方案

方案一:正向筛选(推荐)

直接遍历数组,将符合条件的键值对存入新数组,逻辑更清晰易懂:

$filteredArray = [];
foreach ($datesresult as $key => $value) {
    // 匹配目标键:hour、minute,或包含add_date的键
    if ($key === 'hour' || $key === 'minute' || strpos($key, 'add_date') !== false) {
        $filteredArray[$key] = $value;
    }
}
// 替换原数组
$datesresult = $filteredArray;

方案二:反向删除

如果要直接操作原数组,判断不满足条件的键再执行unset:

foreach ($datesresult as $key => $value) {
    // 当键既不是hour/minute,也不包含add_date时删除
    if ($key !== 'hour' && $key !== 'minute' && strpos($key, 'add_date') === false) {
        unset($datesresult[$key]);
    }
}

注意:strpos未匹配到内容时会返回false,所以必须用!== false或=== false做严格比较,避免因返回0(匹配到字符串开头)导致的判断错误。

内容的提问来源于stack exchange,提问作者Emma W

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 20:50:35