[英]Filter array to keep elements where the key exists in the value string
我需要通过检查是否在其值中找到它的键(区分大小写)作为 ZE83AED3DDF4667DEC0DAAAACB2BB3BE0BZ,来过滤我的字符串类型值的平面关联数组。 换句话说,如果元素的键在元素的值中,我想将该元素保留在 output 数组中。
我可以通过调用strpos()
来制作经典的foreach()
循环,但这感觉非常平淡。 有没有更现代/优雅的方式来做到这一点?
我的代码:
$array = [
'needle' => 'needle in haystack text',
'Need' => 'another needle',
'fine' => 'refined',
'found' => 'Foundation',
'' => 'non-empty haystack',
'missing' => 'not here',
'This is 0 in a haystack!',
];
$result = [];
foreach ($array as $needle => $haystack) {
if (strpos($haystack, $needle) !== false) {
$result[$needle] = $haystack;
}
}
var_export($result);
Output:
array (
'needle' => 'needle in haystack text',
'fine' => 'refined',
'' => 'non-empty haystack',
0 => 'This is 0 in a haystack!',
)
从 PHP5.6 开始, array_filter()
获得了ARRAY_FILTER_USE_BOTH
标志。 这使得array_filter()
成为一种等效的函数式技术。
代码:(演示)
var_export(
array_filter(
$array,
function($haystack, $needle) {
return strpos($haystack, $needle) !== false;
},
ARRAY_FILTER_USE_BOTH
)
);
这样做的一个优点是不需要声明$result
。 另一方面,尽管它在技术上可以写成单行代码,但它会产生很长的代码行——根据PSR-12 ,这会使代码接近或超过每行的软字符限制编码标准。 因此,到目前为止,几乎没有什么可以迫使您更改代码。
好消息是 PHP8 专门引入了str_contains()
以提供干净、原生、区分大小写的 function 来替换strpos()
及其强制性的严格 boolean false
检查。
代码:(演示)
var_export(
array_filter($array, 'str_contains', ARRAY_FILTER_USE_BOTH)
);
这将返回相同的所需 output,它是一种功能样式、单行且简洁地跨越 59 个字符。 我会推荐这种方法。
为了理解正在发生的事情, array_filter()
的详细语法,其中str_contains()
不是由其字符串名称调用的,如下所示:
var_export(
array_filter(
$array,
fn($haystack, $needle) => str_contains($haystack, $needle),
ARRAY_FILTER_USE_BOTH
)
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.