过滤平面数组,其中在另一个平面数组中找到前导整数

问题描述 投票:0回答:3

我需要对两个数组进行相交,其中给定值的前导数字在另一个数组中找到。

$A = [
    '104-20_140.1',
    '104-10_136.1',
    '104-40_121.1',
    '104-41_122.1',
    '200-42_951.1',
    '200-43_952.1',
    '200-44_123.1',
    '200-45_124.1',
    '300-46_125.1',
    '300-47_126.1', 
    '300-48_127.1',
    '300-49_128.1',
    '380-56_125.1',
    '380-57_126.1',
    '380-58_127.1',
    '380-59_128.1',
];

$B = ['200', '300'];

我需要两次查看数组 A 的值的开头。前任。 [0] => 104-20_140 并查看开头 '104' 是否存在于数组 B 中。如果不存在,数组 A 将从结果数组 C 中删除它。

数组 A 和 B 的输出应具有:

[
     '200-42_951.1',
     '200-43_952.1',
     '200-44_123.1',
     '200-45_124.1',
     '300-46_125.1',
     '300-47_126.1',
     '300-48_127.1',
     '300-49_128.1',
]
php arrays filtering prefix array-intersect
3个回答
1
投票

试试这个:

function startsWith($haystack, $needle) {
    $length = strlen($needle);
    return (substr($haystack, 0, $length) === $needle);
}

$C = array();
foreach ($A as $ka => $va) {
    foreach ($B as $kb => $vb) {
        if (startsWith($va, $vb)) {
            $C[] = $va;
        }
    }
}

键盘上的示例


1
投票

很可能,您真正需要的是 array_uintersect。这将提供提供自定义回调的选项,其中包含如何检查值是否相交的逻辑。

http://uk3.php.net/manual/en/function.array-uintersect.php

在回调中,您需要使用 substr 或其中一个 preg 函数解析第一个“-”之前的第一部分。


0
投票

您可以通过使用基本循环并仅使用在白名单中找到整个前导整数的值填充结果数组,以线性时间复杂度快速通过平面白名单数组过滤输入数组。

代码:(演示

$whitelist = ['200', '300'];

$result = [];
foreach ($array as $v) {
    if (in_array(strstr($v, '-', true), $whitelist)) {
        $result[] = $v;
    }
}
var_export($result);
© www.soinside.com 2019 - 2024. All rights reserved.