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的键值对,删除其余内容。
问题原因
之前的代码存在两个核心错误:
- 逻辑颠倒:你原本想保留符合条件的键,却在满足条件时执行
unset,等于把需要保留的内容主动删除了。 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
相关产品推荐
相关产品推荐

