Использование str_replace () со значениями массива, дающими неожиданные результаты - PullRequest
0 голосов
/ 14 января 2019

Использование str_replace () для замены значений в нескольких параграфах текстовых данных, кажется, делает это, но в нечетном порядке. Заменяемые значения находятся в жестко заданном массиве, а замены - в массиве из запроса, предоставленного пользовательской функцией DBConnect ().

Я использовал print_r () для обоих, чтобы убедиться, что они правильные, и они: оба имеют одинаковое количество записей и в том же порядке, но результаты на экране не совпадают. Я ожидал, что это будет просто, и не думал, что для этой простой задачи нужен цикл, поскольку str_replace () сам обычно это обрабатывает, но я что-то упустил?

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

и $ замены:

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

Ответы [ 2 ]

0 голосов
/ 14 января 2019

- отредактировано: убраны некоторые бессмысленные утверждения -

@ ДонП, то, что вы пытаетесь сделать, возможно.

На мой взгляд, функция 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);
?>
0 голосов
/ 14 января 2019

Как только я увидел, как на самом деле выглядит массив $ 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
)
...