Я пытаюсь имитировать эту ошибку с образцом PHP-кода, но не был успешным. Любая помощь будет большой.
«Невозможно использовать смещение строки в виде массива»
… это воспроизвело ошибку:
$foo = 'bar'; $foo[0] = 'bar';
… это воспроизвело ошибку:
$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
..