Php как сопоставить точные числа и символы в строке с помощью preg_match?

Я анализирую некоторые данные и стандартизирую их для своего веб-сайта. Данные, которые я получаю при разборе:

[sizes] => Array
    (
        [0] => 5
        [1] => 6
        [2] => 10
        [3] => 6+
        [4] => 7
        [5] => 7+
        [6] => 8
        [7] => 8+
        [8] => 9
    )

Мне нужно получить:

[0] => US - 5
[1] => US - 6
[2] => US - 10
[3] => US - 6.5
[4] => US - 7.5
[5] => US - 8.5

Я пробовал как preg_replace (всевозможные варианты), так и str_replace, но ничего не работает. Похоже, что он перезаписывает значения:

 $sizes[$i]= str_replace("7", "US - 7", $sizes[$i]); 
 $sizes[$i] = preg_replace('/\b6\b/', "US - 6", $sizes[$i]); 
 $sizes[$i] = preg_replace('~6\+$~m', "US - 6.5", $sizes[$i]); 
 $sizes[$i] = preg_replace('~5+$~m', "US - 5.5", $sizes[$i]);

Я получаю что-то вроде этого:

        [0] => US - 10
        [1] => US - 5.US - 5
        [2] => US - 6
        [3] => US - 6.US - 5.US - 5
        [4] => US - 7
        [5] => US - 8
        [6] => US - 9
        [7] => US - US - 7.5
        [8] => US - US - 8.5

Если бы кто-нибудь мог помочь, я был бы признателен. Спасибо

Являются ли ваши данные одной длинной строкой, похожей на вывод print_r, или это массив строк?

trincot 26.10.2018 09:27

это массив строк

Sanamarina 26.10.2018 09:28

Какая логика сохранить 6, а не 7,8 и 9?

splash58 26.10.2018 09:30

Так что же такое массив? Добавьте это к вопросу, чтобы мы могли воспроизвести.

Wiktor Stribiżew 26.10.2018 09:31

Это был лишь частичный пример. Мне он нужен для всех чисел в массиве.

Sanamarina 26.10.2018 09:34
0
5
66
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вместо того, чтобы пытаться использовать регулярные выражения и предполагать, что константа 'US - x' и + означает размер .5, затем используйте префикс US - и просто замените + на .5 и используйте array_walk() для обработки каждого элемента ...

$size = [0 => "5",
    1 => "6",
    2 => "10",
    3 => "6+",
    4 => "7",
    5 => "7+",
    6 => "8",
    7 => "8+",
    8 => "9"];

array_walk($size, function (&$data) { 
                $data = "US - ".str_replace("+", ".5", $data); 
});
print_r($size);

выходы ...

Array
(
    [0] => US - 5
    [1] => US - 6
    [2] => US - 10
    [3] => US - 6.5
    [4] => US - 7
    [5] => US - 7.5
    [6] => US - 8
    [7] => US - 8.5
    [8] => US - 9
)

Конечно, вы можете использовать любой тип цикла, а не только array_walk(), основная логика такая же.

Это идеально! Спасибо!

Sanamarina 26.10.2018 09:38

Вот еще один подход:

<?php

$result = [];
$size = [
    0 => "5",
    1 => "6",
    2 => "10",
    3 => "6+",
    4 => "7",
    5 => "7+",
    6 => "8",
    7 => "8+",
    8 => "9"
];

foreach($size as $key => $value) {
    $result[$key] = "US - " . number_format(floatval($value), 2);
}

echo "<pre>";
print_r($result);
echo "</pre>";

Выход:

Array
(
    [0] => US - 5.00
    [1] => US - 6.00
    [2] => US - 10.00
    [3] => US - 6.00
    [4] => US - 7.00
    [5] => US - 7.00
    [6] => US - 8.00
    [7] => US - 8.00
    [8] => US - 9.00
)

Другие вопросы по теме