繁体   English   中英

过滤数组以保留值字符串中存在键的元素

[英]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.

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