【问题标题】:Using str_replace() With Array Values Giving Unexpected Results使用带有数组值的 str_replace() 会产生意外的结果
【发布时间】:2019-06-08 00:21:52
【问题描述】:

使用 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
)

【问题讨论】:

  • 你能给我们看一个$replacements数组的例子吗
  • 您不能在数组上使用 str_replace。 str_replace 在字符串上使用。
  • @AbedPutra From: php.net/manual/en/function.str-replace.php "搜索:正在搜索的值,也称为针。可以使用数组来指定多个针。"。除此之外,所有参数都可以是一个数组。
  • @MattFryer 哦,对不起,我没有仔细阅读。对于DonP,你试试这个stackoverflow.com/questions/24554723/…
  • @AbedPutra 无需道歉 :)

标签: php arrays str-replace


【解决方案1】:

一旦我看到 $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
)

【讨论】:

  • 您也可以将数据库查询获取模式从两者更改为关联。
  • $filtered = array_filter($data, 'is_string', ARRAY_FILTER_USE_KEY)
  • 谢谢,我让它工作了,并且已经发布了我的代码作为答案。至于更改 db 查询获取模式,我想这是可能的,但包含它的自定义函数在我的五个网站上使用,所以我现在可能不想搞砸。
【解决方案2】:

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

@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);
?>

【讨论】:

  • 谢谢您,但不确定您的意思是占位符与表格列不同,除非它参考您自己的代码。它们并不打算相同,也不需要它们,而且对于我的代码,它们可以是任何东西,只要它们在 $replace 数组中并且在数组位置匹配替换它们的位置。它基本上只是一个字符串被另一个值替换。请参阅下面我已经发布的我自己的解决方案,但再次感谢看起来很有趣的其他想法。
  • @DonP,我需要编辑它,因为它没有意义。已经很晚了,那是一个大脑放屁。除此之外,我看到两个解决方案。 1.您可以要求您的MySQL连接返回一个只有关联键的数组,或者使用strtr()明确指定您需要将哪些字符串转换为什么值。
  • stackoverflow.com/questions/9556794/… 的答案将向您展示如何在查询结果中仅请求数字键或关联键。默认情况下,两者都返回。根据您使用的数据库库,您可能需要了解如何传递适当的选项。
  • 我会检查一下并使用 mysqli 进行参考。我从来没有想过可能会有这样的选择,所以谢谢你的想法。
  • 谢谢伙计。这是我讨厌某些 MySQL 客户端的一个特性。它使应用程序消耗大量资源并导致性能不佳,因为它们返回的结果量是所需结果的两倍。
猜你喜欢
  • 1970-01-01
  • 2012-03-30
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多