将str_replace与数组一起使用会产生意外结果

时间:2015-09-29 17:37:41

标签: php arrays if-statement str-replace

我有一个存储在数据库中的ID数组,如1,2,3,4,5,6,7等。

我有一组标签,我试图将这些数字用于以后使用,但我的输出没有显示我的期望。例如,我有这个:

$ids[0] = 7, $ids[1] = 4

我用它来应用标签:

$ids = str_replace('7', '1Mbps Internet', $ids);
$ids = str_replace('4', '2Mbps Internet', $ids);
$ids = str_replace('1', '3Mbps Internet', $ids);
$ids = str_replace('8', 'Commercial Internet', $ids);
$ids = str_replace('12', 'Tower Friends', $ids);
$ids = str_replace('6', 'Cable TV', $ids);
$ids = str_replace('11', 'Cable TV Basic', $ids);
$ids = str_replace('5', 'VOIP', $ids);
$ids = str_replace('10', 'Web Services', $ids);

但是,我的输出看起来像这样:

3Mbps InternetMbps Internet, 2Mbps Internet

什么时候出现这样:

1Mbps Internet, 2Mbps Internet
$Package1 = $ids[0]; 
$Package2 = $ids[1];
$Package3 = $ids[2];
$Package4 = $ids[3];

if (!$Package1) {$P_word = "$Package:"; $Packages = "None Subscribed";}
else if ($Package1 && !$Package2) {$P_Word = "Package:"; $Packages = "$Package1";}
else if ($Package1 && $Package2 && !$Package3) {$P_Word = "Packages:"; $Packages = "$Package1, $Package2";}
else if ($Package1 && $Package2 && $Package3 && !$Package4) {$P_Word = "Packages:"; $Packages = "$Package1, $Package2, $Package3"; }
else {$P_Word = "Packages:"; $Packages = "$Package1, $Package2, $Package3, $Package4"; }

2 个答案:

答案 0 :(得分:3)

str_replace()是基本搜索。您的部分问题是您希望PHP如何搜索您的字符串。例如,

$ids = str_replace('7', '1Mbps Internet', $ids);
$ids = str_replace('4', '2Mbps Internet', $ids);
$ids = str_replace('1', '3Mbps Internet', $ids);

在第3行,您正在搜索字符串" 1"。由于您的第一次通话被替换为" 7"使用" 1Mbps ...",第3行将取代" 1"在那句话中也是如此。我建议迭代数组,或使用一些正则表达式。一种方法是:

$new_data = array();

foreach( $ids as $id ) {
    switch( $id ) {
        case 1:
            $new_data[] = '3Mbps Internet';
            break;
        case 7:
            $new_data[] = '1Mbps Internet';
            break;
    }
}

//remove duplicates?
$new_data = array_unique($new_data);

部分实施,但希望你明白这一点。

答案 1 :(得分:0)

虽然str_replace一个接一个地应用其替换(即使使用数组作为参数调用一次),strtr("字符串翻译")也不会。

请参阅manual

  

如果给出两个参数,则第二个应该是array('from' => 'to', ...)形式的数组。返回值是一个字符串,其中所有出现的数组键都已被相应的值替换。将首先尝试最长的密钥。 更换子字符串后,将不再搜索其新值。

(突出显示已添加)

所以你可以做的是:

$ids = strtr($ids, array(
    '7' => '1Mbps Internet',
    '4' => '2Mbps Internet',
    '1' => '3Mbps Internet',
    '8' => 'Commercial Internet',
    '12'=> 'Tower Friends',
    '6' => 'Cable TV',
    '11'=> 'Cable TV Basic',
    '5' => 'VOIP',
    '10', 'Web Services', $ids);
));