PHP:使用 strpos 和 str_replace 组合数组

PHP: combine arrays using strpos and str_replace

我有 2 个数组,看起来像这样:

$alertTypes = ['outbid', 'subAllVendorComments'];

$channels = ['outbiduseSms', 'outbiduseBrowser', 'subAllVendorCommentsuseEmail', 'subAllVendorCommentsuseWhatsApp'];

我的目标是将它们组合成一个结构如下的数组:

Array
(
    [outbid] => Array
        (
            [0] => useSms,
            [1] => useBrowser
        )

    [subAllVendorComments] => Array
        (
            [0] => useEmail,
            [1] => useWhatsApp
        )
)

每个子数组中的元素都是 $channels 数组中以 $alertTypes 数组中的单词开头的单词。

我尝试了以下方法,但它不起作用,因为它依赖于 $channels 数组中只有一个元素以 $alertTypes 数组中的相同单词开头:

$result = [];

for($i = 0; $i < count($alertTypes); $i++) {
    if(strpos($channels[$i], $alertTypes[$i]) !== false) {
        $result[$alertTypes[$i]] = [str_replace($alertTypes[$i], '', $channels[$i])];
    }
}

感谢任何帮助。

您对两个数组使用了相同的索引 $i,只有当 $alertTypes 中的字符串位于 $channels 的相应元素中时才有效。您需要将警报类型与所有通道进行比较,这可以使用嵌套循环来完成。

您还替换了 $result 的元素,而不是推入嵌套数组。

如果使用 foreach 而不是 for,代码也会更简单。

foreach ($alertTypes as $alert) {
    $array = [];
    foreach ($channels as $channel) {
        if (strpos($channel, $alert) !== false) {
            $array[] = str_replace($alert, '', $channel);
        }
    }
    $result[$alert] = $array;
}

获得相同结果的另一种方法:

首先,我使用 alertTypes 值中的键和空数组作为值来设置 arrayResult。然后我“遍历”数组通道,对于每个通道,我检查 arrayResult 键,当我发现 arrayResult 键是通道值的请求时,我将它设置为 arrayResult 中该键的值。

<?php

$arrayResult = array_combine($alertTypes, array_fill(0, count($alertTypes), array()));

array_walk($channels, function($channel) use (&$arrayResult) {
    foreach($arrayResult as $key => $array) {
        if(strpos($channel, $key) === 0) {
            $arrayResult[$key][] = str_replace($key, '', $channel);
        }
    }
});

?>