Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:使用strpos和stru替换组合数组_Php_Arrays_Loops_Str Replace_Strpos - Fatal编程技术网

PHP:使用strpos和stru替换组合数组

PHP:使用strpos和stru替换组合数组,php,arrays,loops,str-replace,strpos,Php,Arrays,Loops,Str Replace,Strpos,我有两个数组,如下所示: $alertTypes = ['outbid', 'subAllVendorComments']; $channels = ['outbiduseSms', 'outbiduseBrowser', 'subAllVendorCommentsuseEmail', 'subAllVendorCommentsuseWhatsApp']; Array ( [outbid] => Array ( [0] => use

我有两个数组,如下所示:

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

$channels = ['outbiduseSms', 'outbiduseBrowser', 'subAllVendorCommentsuseEmail', 'subAllVendorCommentsuseWhatsApp'];
Array
(
    [outbid] => Array
        (
            [0] => useSms,
            [1] => useBrowser
        )

    [subAllVendorComments] => Array
        (
            [0] => useEmail,
            [1] => useWhatsApp
        )
)
我的目标是将它们组合成一个数组,其结构如下:

$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])];
    }
}
$result=[];
对于($i=0;$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);
        }
    }
});

?>

工作完美,我学到了很多,谢谢!