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);
}
}
});
?>
我有 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);
}
}
});
?>