str_replace се дъни при масиви

Pok4

Registered
Здр ALL!
Има някакъв проблем в този код:
PHP:
<?php
$locations_id = array(8,9,12,13,14,15,16,24,25,26,23,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,46,45);
$replace_locations   = array("Burgas", "Aheloi", "Ravda","Nesebar","Sunny Beach","Sarafovo","Pomorie","Tankovo","Elenite","Dyuni","Kosharitsa","Sveti Vlas","Sozopol","Primorsko","Kiten","Sinemorets","Ahtopol","Chernomorets","Obzor","Kraimorie","Varvara","Varna","Sv. Konstantin i Elena","Golden Sands","Albena","Balchik","Kavarna","Dobrich","Byala","Topoli (village)","Kamchia");
        
echo str_replace($locations_id,$replace_locations,28);

28 = Sozopol, но го вади като 2Burgas... явно отчита 8-цата при 28.. Може ли някой да даде нещо, което няма да се дъни ? Благодаря!

Пс:
Това го хванах на момента, може и при другите да има проблем..
Php 8.1 ми е версията..
 
Последно редактирано:
Не се дъни, просто ползваш стрингова функция за нещо друго - виж описанието ѝ https://www.php.net/str_replace.
"str" частта от "str_replace" e съкращение за "string", тоест се предполага, че последният аргумент (в твоя случай - 28) е стринг (или масив от стрингове), в които се извършва заместването.

Освен това, "If search or replace are arrays, their elements are processed first to last.".
Та при теб, 28 се обръща в стринг като "28", и върху него първо се заместват всички срещания на "8", после на "9", после на "12", "13" и т.н.

На теб ти трябва просто мап (речник), или както в PHP света обичат да казват, "асоциативен масив":

PHP:
$locations = [
    8 => "Burgas",
    9 => "Aheloi",
    // и т.н.
]

И след това, вместо str_replace, можеш просто да кажеш $location[ЧИСЛО] -
PHP:
$locations[28]
и ще получиш желания Созопол.
 
Оф, ясно.. Сега съм от телефона и няма как да продължа.. Батерията на лаптопа падна..
А иначе, няма ли вариант да не пренаписвам? Смисъл с preg replace или нещо от този сорт?
Не ми е проблем, но ако е възможно масивите да си останат така - за мен ще е по-добре...
 
Майната му, пренаписах го :)
Мерси за обяснението.. Функцията ми е добре позната, но не съм я ползвал с масиви. Просто чекнах в стака и попаднах на готов код от някакъв потребител и при мен сбози.. :D
 
Последно редактирано:
Като не искаш да пренаписваш (въпреки че вече си) можеш да използваш array_combine($keys, $values).

PHP:
<?php
$locations_id = array(8,9,12,13,14,15,16,24,25,26,23,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,46,45);
$replace_locations   = array("Burgas", "Aheloi", "Ravda","Nesebar","Sunny Beach","Sarafovo","Pomorie","Tankovo","Elenite","Dyuni","Kosharitsa","Sveti Vlas","Sozopol","Primorsko","Kiten","Sinemorets","Ahtopol","Chernomorets","Obzor","Kraimorie","Varvara","Varna","Sv. Konstantin i Elena","Golden Sands","Albena","Balchik","Kavarna","Dobrich","Byala","Topoli (village)","Kamchia");

$combined = array_combine($locations_id, $replace_locations);

И след това, каквото @anonimen ти каза.
 
  • Like
Реакции: Pok4
Супер :)
 

Back
Горе