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

时间:2019-01-13 23:52:38

标签: php arrays str-replace

使用str_replace()替换文本数据的几段中的值,似乎可以这样做,但是顺序很奇怪。替换的值位于硬编码数组中,而替换的值位于来自称为DBConnect()的自定义函数提供的查询的数组中。

我在两个上都使用了print_r()来验证它们是否正确,并且它们是:两者具有相同的条目数并且顺序相同,但是屏幕上的结果不匹配。我以为这很简单,并且认为str_replace()本身通常会处理该简单任务,因此不需要任何循环,但是我错过了什么吗?

$replace = array('[MyLocation]','[CustLocation]','[MilesInc]','[ExtraDoc]');
$replacements = DBConnect($sqlPrices,"select",$siteDB);
$PageText = str_replace($replace,$replacements,$PageText);

和$ replacements是:

Array
(
    [0] => 25
    [MyLocation] => 25
    [1] => 45
    [CustLocation] => 45
    [2] => 10
    [MilesInc] => 10
    [3] => 10
    [ExtraDoc] => 10
)

2 个答案:

答案 0 :(得分:0)

一旦我看到了$ replacements数组的实际外观,就可以通过滤除数字键来修复它。

$replace = array('[MyLocation]','[CustLocation]','[MilesInc]','[ExtraDoc]');
$replacements = DBConnect($sqlPrices,"select",$siteDB);

foreach ($replacements as $key=>$value) :
    if (!is_numeric($key)) $newArray[$key] = $value;
endforeach;

$PageText = str_replace($replace,$newArray,$PageText);

以前的$ replacements数组,过滤为$ newArray,看起来像这样:

Array
(
    [MyLocation] => 25
    [CustLocation] => 45
    [MilesInc] => 10
    [ExtraDoc] => 10
)

答案 1 :(得分:0)

-已编辑:删除了一些无意义的陈述-

@DonP,您想做的事情是可能的。

我认为strtr()函数可能对您更有利。您需要像这样对代码进行一些调整...

<?php
$replacements = DBConnect($sqlPrices,"select",$siteDB);
$PageText = strtr($PageText, [
  '[MyLocation]' => $replacements['MyLocation'],
  '[CustLocation]' => $replacements['CustLocation'],
  '[MilesInc]' => $replacements['MilesInc'],
  '[ExtraDoc]' => $replacements['ExtraDoc'],
]);
?>

此代码有点冗长,需要编写重复的字符串。一旦了解了它的工作方式,就可以使用一些循环或数组函数对其进行重构。例如,您可以使用以下更紧凑的版本...

<?php
// Reference fields.
$fields = ['MyLocation', 'CustLocation', 'MilesInc', 'ExtraDoc'];

// Creating the replacement pairs.
$replacementPairs = [];
foreach($fields as $field){
  $replacementPairs["[{$field}]"] = $replacements[$field];
}

// Perform the replacements.
$PageText = strtr($PageText, $replacementPairs);
?>