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

发布于 2024-12-03 11:53:09 字数 748 浏览 0 评论 0原文

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

$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',
]

I need to intersect two arrays where the leading number of a given value is found in another array.

$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'];

I need two look at Array A's beginning of the value. Ex. [0] => 104-20_140 and see if the beginning '104' it exists in Array B. If not Array A shall remove it from the result array C.

The output with Array A and B should have:

[
     '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',
]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

晨敛清荷 2024-12-10 11:53:09

试试这个:

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;
        }
    }
}

键盘上的示例

Try this:

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;
        }
    }
}

example on codepad

与君绝 2024-12-10 11:53:09

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

https://www.php.net/manual/en/function。 array-uintersect.php

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

Chances are, what you really need is array_uintersect. This will give the option to provide a custom callback which contains the logic on how to check if values intersect.

https://www.php.net/manual/en/function.array-uintersect.php

In the callback, you will need to parse out first section before the first "-" using substr or one of the preg functions.

雾里花 2024-12-10 11:53:09

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

代码:(演示)

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

$result = [];
foreach ($array as $v) {
    if (in_array(strstr($v, '-', true), $whitelist)) {
        $result[] = $v;
    }
}
var_export($result);

You can filter your input array by your flat whitelist array swiftly with linear time complexity by using a basic loop and only populating the result array with values where the whole leading integer is found in the whitelist.

Code: (Demo)

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

$result = [];
foreach ($array as $v) {
    if (in_array(strstr($v, '-', true), $whitelist)) {
        $result[] = $v;
    }
}
var_export($result);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文