PHP 看到一个字符串如single char

PHP see a string such as single char

我有这个代码:

<?php
set_time_limit(0);
ini_set('display_errors','On');
function ImportCSV2Array($filename)
{
    $row = 0;
    $col = 0;

    $handle = @fopen($filename, "r");
    if ($handle) 
    {
        while (($row = fgetcsv($handle, 4096,";")) !== false) 
        {
            if (empty($fields)) 
            {
                $fields = $row;
                continue;
            }

            foreach ($row as $k=>$value) 
            {
                $results[$col][$fields[$k]] = $value;
            }
            $col++;
            unset($row);
        }
        if (!feof($handle)) 
        {
            echo "Error: unexpected fgets() failn";
        }
        fclose($handle);
    }

    return $results;
}
include_once("../config.php");
$nome_file = "./".$_GET['file'];

$csvArray = ImportCSV2Array($nome_file);
$i = 0;
foreach ($csvArray as $row=>$value)
{

$mp = array("1","2","3","4","5","7","11","12","13","16","17","18","26","27","28","33","34","42","43","45");
$fin = array("0","1","2","4","8","15","20","21","22","30","31","32","40","41","42","52","54","81","82","91");
            $codEvento = str_replace($mp, $fin, trim($value['CODEV']));

        if($value['INDEX']==0){
            echo $codEvento."-".$value['CODEV'].";".$value['COGNNOME'].";".$value['TEMPO'].";".$value['ANNO'].";".$value['DATA']."<br>";

        }
    }

?>

当我尝试用 str_replace 将 $mp 数组转换为 $fin 数组时,我遇到了问题。

如果我的 $value['CODEV'] 第一次包含“12”,它会替换为 23,因为 1 被 2 替换,2 被 3 替换。为什么它会看到这样的“12”字符串两个不同的字符串?为什么它不将“12”替换为“21”?

当您提供数组作为 str_replace 的搜索和替换参数时,它会循环遍历并将每个找到的搜索字符串替换为您输入中的相应替换字符串。

在您的例子中,“12”是输入,因此它采取的第一个操作是用“0”替换“1”,留下值“02”。接下来它找到“2”并将其替换为“1”,从而为您提供值“01”。没有更多匹配项,因此您将以“01”结尾。

如果您重新排序 search/replace 对,以便“12”出现在列表的前面,您仍然会得到错误的值。第一次搜索会将“12”替换为“21”(您想要的),但后来的搜索会将“1”替换为“0”,将“2”替换为“1”,这次将您替换为“10”。

问题是您的搜索字符串数组会自行执行。如果要完全替换输入字符串,那么循环可能会更好,如下所示:

$mp = array("1","2","3","4","5","7","11","12","13","16","17","18","26","27","28","33","34","42","43","45");
$fin = array("0","1","2","4","8","15","20","21","22","30","31","32","40","41","42","52","54","81","82","91");
$input = "12";
$output = "?";
for ($i=0; $i<count($mp); $i++) {
    if ($input === $mp[$i]) {
        $output = $fin[$i];
        break;
    }
}
echo $output