Заменить одну и ту же строку разными значениями для каждого случая

#php

#php

Вопрос:

Я пытаюсь заменить одну и ту же строку разными значениями для каждого случая, но у меня возникают большие проблемы, и я понятия не имею, как это исправить.

 $order = "john, book, 1";
$order = explode(',', $order);

$url = "https://fakerestapi.azurewebsites.net/api/author/{}/data/{}/oc/v/{}/";
$repeat =  substr_count($url, "{}");

for ($i=0; $i<=$repeat; $i  ) {
    $final .= str_replace('{}', $repeat[$i], $url);
}

echo $final;
 

Текущий вывод:

 NOTICE Undefined variable: final on line number 10

https://fakerestapi.azurewebsites.net/api/author//data//oc/v/https://fakerestapi.azurewebsites.net/api/author//data//oc/v/https://fakerestapi.azurewebsites.net/api/author//data//oc/v/https://fakerestapi.azurewebsites.net/api/author//data//oc/v/
 

Мой ожидаемый результат должен быть примерно таким:

 https://fakerestapi.azurewebsites.net/api/author/john/data/book/oc/v/1/
 

Вы можете мне помочь?
Спасибо

Комментарии:

1. Посмотрите sprintf .

2. Сообщение об ошибке довольно четкое. Вы забыли объявить $final переменную?

3. substr_count() возвращает целое число, а не массив

Ответ №1:

это будет работать

 <?php

$order = "john, book, 1";
$order = explode(',', $order);


$url = "https://fakerestapi.azurewebsites.net/api/author/{}/data/{}/oc/v/{}/";
$repeat =  substr_count($url, "{}");

$final = $url;

for ($i=0; $i < $repeat; $i  ) {
    $final = preg_replace('/{}/', $order[$i], $final, 1);
}

echo $final;

?>
 

Комментарии:

1. Это доставило https://fakerestapi.azurewebsites.net/api/author/john/data/john/oc/v/john/ бы, верно? Потому что после первой итерации $final больше не содержит {}

2. это обеспечит ожидаемый результат

3. Это забавно, потому что для меня это не так.

4. извините, моя ошибка — $final = preg_replace('/{}/', $order[$i], $final, 1); . я должен использовать preg_replace вместо str_replace — см. Отредактированный ответ

5. Не проблема. Может быть, используйте trim() , потому что теперь вы получите https://fakerestapi.azurewebsites.net/api/author/john/data/ book/oc/v/ 1/ (включая пробелы)

Ответ №2:

Я предполагаю, что ваш $order массив будет иметь только три значения,

 $order = "john, book, 1";
$order = explode(',', $order);

$url = "https://fakerestapi.azurewebsites.net/api/author/%s/data/%s/oc/v/%s/";

echo sprintf($url, trim($order[0]), trim($order[1]), trim($order[2]));
 

ВЫВОД:

 https://fakerestapi.azurewebsites.net/api/author/john/data/book/oc/v/1/
 

Ответ №3:

Сделайте URL-адрес массивом с помощью explode и соедините два массива в цикле.

 $order = "john, book, 1";
$order = explode(', ', $order);


$url = "https://fakerestapi.azurewebsites.net/api/author/{}/data/{}/oc/v/{}/";
$url = explode("{}", $url);
$final ="";

foreach($url as $key => $u){
    $final .= $u;
    if(isset($order[$key])) $final .= $order[$key];
}

echo $final;
//https://fakerestapi.azurewebsites.net/api/author/john/data/book/oc/v/1/