Intereting Posts
Селектор id jQuery не работает, когда есть. в ID Получение одной строки только с MySQLi Загрузка классов с именами с автозагрузчиком Symfony 1.4? Передача данных формы и файла на php с использованием ajax Как интегрировать загрузку Blue Imp в CakePHP? Регулярное выражение, преобразующее текстовые списки в html в PHP Разрешение: эта таблица не содержит уникальный столбец. Редактирование сетки, флажок, редактирование, копирование и удаление недоступны Скопируйте изображение буфера обмена на веб-страницу с помощью JQuery Получение строки запроса PDO со связанными параметрами без ее выполнения Как сделать MD5 более безопасным? Или это действительно необходимо? Невозможно создать проект Zend Framework в Netbeans 6.9.1 Откройте класс Auth, чтобы разрешить вход в систему через facebook, google, твиттер и т. Д. -> так же, как SO Метод PHP для динамического получения значений из свойства объекта массива Как читать параметры запроса OAuth с помощью PHP? Symfony2: как установить URL-адрес хоста / базы в сценариях CLI

Невозможно использовать строковое смещение в виде массива в php

Я пытаюсь имитировать эту ошибку с образцом PHP-кода, но не был успешным. Любая помощь будет большой.

«Невозможно использовать смещение строки в виде массива»

Solutions Collecting From Web of "Невозможно использовать строковое смещение в виде массива в php"

Для PHP4

… это воспроизвело ошибку:

$foo = 'bar'; $foo[0] = 'bar'; 

Для PHP5

… это воспроизвело ошибку:

 $foo = 'bar'; if (is_array($foo['bar'])) echo 'bar-array'; if (is_array($foo['bar']['foo'])) echo 'bar-foo-array'; if (is_array($foo['bar']['foo']['bar'])) echo 'bar-foo-bar-array'; 

(От bugs.php.net на самом деле)

Редактировать,

поэтому почему ошибка не появляется в первом условии if, даже если это строка.

Поскольку PHP – очень прощающий язык программирования, я бы предположил. Я проиллюстрирую код того, что, по моему мнению, происходит:

 $foo = 'bar'; // $foo is now equal to "bar" $foo['bar'] = 'foo'; // $foo['bar'] doesn't exists - use first index instead (0) // $foo['bar'] is equal to using $foo[0] // $foo['bar'] points to a character so the string "foo" won't fit // $foo['bar'] will instead be set to the first index // of the string/array "foo", ie 'f' echo $foo['bar']; // output will be "f" echo $foo; // output will be "far" echo $foo['bar']['bar']; // $foo['bar'][0] is equal calling to $foo['bar']['bar'] // $foo['bar'] points to a character // characters can not be represented as an array, // so we cannot reach anything at position 0 of a character // --> fatal error 

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

В методе __get () я использовал данный аргумент как свойство, как в (упрощенном примере):

 function __get($prop) { return $this->$prop; } 

… т.е. $ obj-> fred будет обращаться к частному / защищенному свойству fred класса.

Я обнаружил, что когда мне нужно было ссылаться на структуру массива внутри этого свойства, он сгенерировал Can Can use String offset как ошибку массива. Вот что я сделал неправильно и как исправить:

 function __get($prop) { // this is wrong, generates the error return $this->$prop['some key'][0]; // this is correct $ref = & $this->$prop; return $prop['some key'][0]; } 

Объяснение: в неправильном примере php интерпретирует ['some key'] как ключ к $prop (строка), тогда как нам нужно его разыменовать $ prop на месте. В Perl вы можете сделать это, указав с помощью {}, но я не думаю, что это возможно в PHP.

Я просто хочу объяснить свое решение по той же проблеме.

мой код до (с той же ошибкой):

 $arr2= ""; // this is the problem and solve by replace this $arr2 = array(); for($i=2;$i<count($arrdata);$i++){ $rowx = explode(" ",$arrdata[$i]); $arr1= ""; // and this is too for($x=0;$x<count($rowx);$x++){ if($rowx[$x]!=""){ $arr1[] = $rowx[$x]; } } $arr2[] = $arr1; } for($i=0;$i<count($arr2);$i++){ $td .="<tr>"; for($j=0;$j<count($hcol)-1;$j++){ $td .= "<td style='border-right:0px solid #000'>".$arr2[$i][$j]."</td>"; //and it's($arr2[$i][$j]) give an error: Cannot use string offset as an array } $td .="</tr>"; } 

мой код после и решил:

 $arr2= array(); //change this from $arr2=""; for($i=2;$i<count($arrdata);$i++){ $rowx = explode(" ",$arrdata[$i]); $arr1=array(); //and this for($x=0;$x<count($rowx);$x++){ if($rowx[$x]!=""){ $arr1[] = $rowx[$x]; } } $arr2[] = $arr1; } for($i=0;$i<count($arr2);$i++){ $td .="<tr>"; for($j=0;$j<count($hcol)-1;$j++){ $td .= "<td style='border-right:0px solid #000'>".$arr2[$i][$j]."</td>"; } $td .="</tr>"; } 

Благодаря. Надеюсь, это поможет, и извините, если мой английский беспорядок, как комната мальчика: D

Когда вы напрямую печатаете print_r(($value['<YOUR_ARRAY>']-><YOUR_OBJECT>)); то он показывает эту фатальную ошибку. Cannot use string offset as an object in . Если вы печатаете так

$var = $value['#node']-><YOU_OBJECT>; print_r($var);

Вы не получите ошибку!

Я верю, что вы спрашиваете о переменной-интерполяции в PHP.

Давайте сделаем простую привязку:

 $obj = (object) array('foo' => array('bar'), 'property' => 'value'); $var = 'foo'; 

Теперь у нас есть объект, где:

 print_r($obj); 

Выдает результат:

 stdClass Object ( [foo] => Array ( [0] => bar ) [property] => value ) 

И мы имеем переменную $var содержащую строку «foo».

Если вы попытаетесь использовать:

 $give_me_foo = $obj->$var[0]; 

Вместо:

 $give_me_foo = $obj->foo[0]; 

Вы получаете сообщение «Can not use string offset as array […]» в результате, потому что то, что вы пытаетесь сделать, на самом деле отправляет сообщение $var[0] объекту $obj . И – как вы можете видеть из прибора – нет содержимого $var[0] . Переменная $var – это строка, а не массив .

В этом случае вы можете использовать фигурные скобки, которые гарантируют, что сначала называется содержимым $var , а затем остальным отправленным сообщениями:

 $give_me_foo = $obj->{$var}[0]; 

Результат – "bar" , как и следовало ожидать.

Я смог воспроизвести это, как только я обновился до PHP 7. Он ломается, когда вы пытаетесь принудительно вставить элементы массива в строку.

 foreach ($foo) { $params = ''; $index = 0; $params[$index]['keyName'] = $name . '.' . $fileExt; } 

После изменения:

 $params = ''; 

чтобы:

 $params = array(); 

Я перестал получать ошибку. Я нашел решение в этой ветке отчета об ошибках . Надеюсь, это поможет.

Ошибка возникает, когда:

 $a = array(); $a['text1'] = array(); $a['text1']['text2'] = 'sometext'; 

затем

 echo $a['text1']['text2']; //Error!! 

Решение

 $b = $a['text1']; echo $b['text2']; // prints: sometext 

..