Помогите разобраться с "Cannot use string offset as an array"

Nexus_Noob

Новичок
Здравствуйте, не могу понять в чем проблема.
Возникает ошибка:
PHP:
Fatal error: Cannot use string offset as an array in /www/system/modules/tours.module/actions/list.action/models/default.model.php on line 8
Код файла:
PHP:
<?
    if(!isset($tours_query)) $tours_query=mysql_query("SELECT *,(SELECT SUM(`clients_num`) FROM `orders__list` WHERE `tour_id`=`tours`.`id`) FROM `tours` ORDER BY `gone_date` DESC LIMIT 0,10");
    $tours=array();
    if(_check_mysql_response($tours_query)){
        while($row=mysql_fetch_assoc($tours_query)){
            $row=_unserialize($row);
            $row['param']['places']['bisy']=(int)array_pop($row);//Ошибка тут
            if(isset($__tours_list__users_list[$row['author']])){
                $row['author']=$__tours_list__users_list[$row['author']];
            }else $row['author']=false;
            if(isset($__tours_list__users_list[$row['history'][count($row['history'])-1]['user']])){
                $row['history'][count($row['history'])-1]['user']=$__tours_list__users_list[$row['history'][count($row['history'])-1]['user']];
            }else $row['history'][count($row['history'])-1]['user']=false;
            $row['publ']=false;
            if(date("Y-m-d H:i:s")>$row['publ_date'] and date("Y-m-d H:i:s")<$row['hide_date']) $row['publ']=true;
            $tours[]=$row;
        };
    }elseif(mysql_num_rows($tours_query)>0) _sys_error("Mod:Tours:List:Default.model:".__LINE__.": Не удалось получить из БД список туров");
?>
Проверял является ли $row массивом:
PHP:
var_dump(
                gettype($row),
                gettype($row['param']),
                gettype($row['param']['places']),
                gettype($row['param']['places']['bisy']),
                gettype(array_pop($row))
            );exit;
На выходе:

PHP:
string(5) "array"
string(5) "array"
string(5) "array"
string(7) "integer"
string(6) "string"
Помоги, пожалуйста, устранить ошибку.
 

Nexus_Noob

Новичок
PHP:
$row=_unserialize($row);
var_dump($row);
Результат:
Код:
array(12) {
  ["id"]=>string(1) "1"
  ["enable"]=>string(1) "0"
  ["name"]=>string(25) "Калуга - Питер"
  ["gone_date"]=>string(19) "2016-08-12 00:00:00"
  ["param"]=>array(4) {
    ["places"]=>
    array(2) {
      ["all"]=>string(2) "49"
      ["bisy"]=>int(0)
    }
    ["hotel"]=>array(3) {
      ["name"]=>string(18) "Гостиница"
      ["address"]=>bool(false)
      ["url"]=>bool(false)
    }
    ["description"]=>string(32) "Тут описание тура"
    ["cost"]=>string(4) "5000"
  }
  ["publ_date"]=>string(19) "2016-03-01 00:44:26"
  ["hide_date"]=>string(19) "2016-08-12 00:00:00"
  ["author"]=>string(1) "1"
  ["create_date"]=>string(19) "2016-03-01 00:44:26"
  ["modify_date"]=>string(19) "2016-05-04 01:29:18"
  ["history"]=>array(26){...}
  ["(SELECT SUM(`clients_num`) FROM `orders__list` WHERE `tour_id`=`tours`.`id`)"]=>string(1) "4"
}
 

флоппик

promotor fidei
Команда форума
Партнер клуба
PHP:
while($row=mysql_fetch_assoc(...)){
 $row=_unserialize($row);
 $row['param']['places']['bisy']=(int)array_pop($row);//Ошибка тут
Гениальный код, ясчитаю.
 

Nexus_Noob

Новичок
Ошибку устранил, проблема была в данных, записанных в БД.
В цикле, при обработке полученных строк, не у каждой строки $row['param'] являлся массивом, отсюда и ошибка.

Проблема решена, однако хочется узнать почему @флоппик назвал код "гениальным".
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@Nexus_Noob, я бы вот не стал там использовать array_pop, но ты без него не сможешь просто так обойтись, знаешь почему? Потому что у тебя там модель данных неправильная, не надо делать такие ключи как у тебя в массиве. остальное уже мелочи.
 

Nexus_Noob

Новичок
@Nexus_Noob, я бы вот не стал там использовать array_pop, но ты без него не сможешь просто так обойтись, знаешь почему? Потому что у тебя там модель данных неправильная, не надо делать такие ключи как у тебя в массиве. остальное уже мелочи.
Обойтись без array_pop()
PHP:
$bisy=end($row);
unset($row['SELECT SUM(`clients_num`) FROM `orders__list` WHERE `tour_id`=`tours`.`id`']);
$row['param']['places']['bisy']=$bisy;
.
Не скажите ли, почему не стоит хранить данные в подобных массивах?

Спрашиваю не от "вредности", а для своего развития.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@Nexus_Noob, логичнее сделать нормальный ключ, не находишь?
 

Nexus_Noob

Новичок
@c0dex, т.е. не стоит создавать ассоциативные массивы, лучше использовать в кач-ве ключей integer?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Ты не понимаешь слова нормальный, это плохо.
PHP:
$row['SELECT SUM(`clients_num`) FROM `orders__list` WHERE `tour_id`=`tours`.`id`']
Вот такой ключ - это НЕ нормально. Там должна быть удобная строка. Потому ты и извращаешься там с array_pop().

И да, твой "обход" этой функции выше - такой же бред, как и сам этот ключ.
 

Nexus_Noob

Новичок
@c0dex, я понимаю, что указанный Вами ключ не является нормальным, именно поэтому я забираю из этого ключа значение, присваиваю его и удаляю сам "кривой" ключ.
Избавиться от этого ключа можно было бы вовсе, однако, если я это сделаю, то мне не уйти от "лишних" манипуляций с массивом полученных данных.
Можно было бы использовать для обработки resource данных функцию musql_fetch_array.
В этом случае мне пришлось бы создавать массив $row ручками, либо удалять "ненужные" ключи, дабы избавиться от дублирования данных.
mysql_fetch_row вынудила бы меня создать ассоциативный массив, который в последствии мне нужно было бы заполнить необходимыми данными
(Тоже самое, что и в при musql_fetch_array и первом варианте действий).

Я посчитал, что использовать array_pop() самый простой выход и до сих своего мнения не изменил, прошу прощения.

Структуру $row можно посмотреть в сообщении этой темы.
В массив $tours этот ключ с "куском SQL" уже не попадает, так в чем проблема?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@Nexus_Noob, ну раз не изменил мнения, то успехов в дальнейшем.
 
Сверху