Возникает ошибка Warning: Illegal string offset 'code'
protected $currencies;
protected $currency;
public static function getCurrencies(){
return \R::getAssoc("SELECT code, title, symbol_left, symbol_right, value, base FROM currency ORDER BY base DESC");
}
public static function getCurrency($currencies){
if(isset($_COOKIE['currency']) && array_key_exists($_COOKIE['currency'], $currencies)){
$key = $_COOKIE['currency'];
}else{
$key = key($currencies);
}
$currency = $currencies[$key];
$currency['code'] = $key;
return $currency;
}
Вот строчка из-за которой выскакивает предупреждение:
$currency['code'] = $key;
Текущий вывод $currencies
Array
(
[USD] => Array
(
[title] => доллар
[symbol_left] => $
[symbol_right] =>
[value] => 1.00
[base] => 1
)
[UAH] => Array
(
[title] => гривна
[symbol_left] =>
[symbol_right] => грн.
[value] => 28.00
[base] => 0
)
[EUR] => Array
(
[title] => Евро
[symbol_left] => €
[symbol_right] =>
[value] => 0.88
[base] => 0
)
)
UPD: уже все работает, проблема была намного глубже в коде, чем я думал...
Сама ошибка "Illegal string offset 'code'" говорит вам о том, что вы пытаетесь использовать строку, как массив. Обращаетесь к неизвестному смещению 'code'.
Для воспроизведения данной ошибки можно воспользоваться следующим кодом:
echo "currency"["code"]; //Warning: Illegal string offset 'code'
Естественно, со строкой так работать нельзя, правильное обращение к элементам строки осуществляется через число:
echo "currency"[1];
Смоделировать ситуацию в вашем коде легко, зададим валюту AED (Дирхам), как строку и будем пытаться ее получить:
$currencies = [
"USD" => ["title" => 1, "base" => 1, "value" => 0],
"EUR" => ["title" => 2, "base" => 1, "value" => 0],
"AED" => 'null'
];
$_COOKIE['currency'] = 'AED';
$r = getCurrency($currencies);
function getCurrency($currencies){
if(isset($_COOKIE['currency']) && array_key_exists($_COOKIE['currency'], $currencies)){
$key = $_COOKIE['currency'];
}else{
$key = key($currencies);
}
$currency = $currencies[$key];
$currency['code'] = $key;
return $currency;
}
Вывод: Warning: Illegal string offset 'code' on line 20
Решение проблемы:
Для решения проблемы требуется понять, почему в вашем массиве появился элемент который является строкой. Самое оптимальное и правильное решение - это подключить дебагер (xdebug) к вашей IDE и прогнать код выставив на данной строчкe breakpoint (точку останова). Если никогда не пользовались, то обязательно начните. Это поможет находить ошибки намного быстрее.
Если дебагера нет или нет возможности им воспользоваться, то найти проблему можно с помощью внесения в код соответствующих временных изменений для получения информации о проблемном элменте. После строки, где присваивается currency добавьте проверку на is_string и сделайте вывод нужных элементов:
$currency = $currencies[$key];
if (is_string($currency)) {
var_dump($key, $currency, $currencies);
}
$currency['code'] = $key;
return $currency;
Вы получите вывод, где первая строка является запрашиваемым ключом, вторая строка из которой берется значение и третья это массив из которого берется значение, тем самым найдете проблемный элемент:
string(3) "AED"
string(4) "null"
array(3) {
["USD"]=>
array(3) {
["title"]=>
int(1)
["base"]=>
int(1)
["value"]=>
int(0)
}
["EUR"]=>
array(3) {
["title"]=>
int(2)
["base"]=>
int(1)
["value"]=>
int(0)
}
["AED"]=>
string(4) "null"
}
Warning: Illegal string offset 'code' on line 20
Далее, ищите ошибку, откуда у вас в массиве появился текстовый элемент.
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Есть админка веб-приложения, в ней админ создаёт уведомление пользователям
Что означает строка в main? Для чего такая конструкция нужна?