Я пытаюсь имитировать эту ошибку с помощью образца php-кода, но не был успешным. Любая помощь будет отличной.
"Невозможно использовать строковое смещение как массив"
Я пытаюсь имитировать эту ошибку с помощью образца 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 фактически)
поэтому почему ошибка не появляется в сначала, если условие, даже если оно строка.
Поскольку 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", i.e '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
Я смог воспроизвести это после того, как обновился до PHP 7. Он ломается, когда вы пытаетесь заставить элементы массива в строку.
$params = '';
foreach ($foo) {
$index = 0;
$params[$index]['keyName'] = $name . '.' . $fileExt;
}
После смены:
$params = '';
чтобы:
$params = array();
Я перестал получать ошибку. Я нашел решение в этой теме сообщения об ошибке. Надеюсь, это поможет.
Я боролся с подобной проблемой, поэтому документирование здесь на всякий случай полезно.
В методе __get()
я использовал данный аргумент как свойство, как в (упрощенный пример):
function __get($prop) {
return $this->$prop;
}
... т.е. $obj->fred
получит доступ к частному/защищенному свойству fred класса.
Я обнаружил, что когда мне нужно было ссылаться на структуру массива в этом свойстве, он генерировал Cannot использовать строковое смещение в качестве ошибки массива. Вот что я сделал не так и как это исправить:
function __get($prop) {
// this is wrong, generates the error
return $this->$prop['some key'][0];
}
function __get($prop) {
// this is correct
$ref = & $this->$prop;
return $ref['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>";
}
Thank х. Надеюсь, это помогло, и извините, если мой английский беспорядок, как комната для мальчиков: D
Когда вы прямо печатаете print_r(($value['<YOUR_ARRAY>']-><YOUR_OBJECT>));
, тогда отображается эта фатальная ошибка Cannot use string offset as an object in
.
Если вы печатаете как это
$var = $value['#node']-><YOU_OBJECT>;
print_r($var);
Вы не получите ошибку!
Я имел эту ошибку, и был чокнутый
мой код был
$aux_users='';
foreach ($usuarios['a'] as $iterador) {
#code
if ( is_numeric($consultores[0]->ganancia) ) {
$aux_users[$iterador]['ganancia']=round($consultores[0]->ganancia,2);
}
}
после изменения $aux_users='';
в $aux_users=array();
это случилось с моим в php 7.2 (на производственном сервере!), но работал на php 5.6 и php 7.0.30, так что будьте внимательны! и спасибо молодому Майклу, надеюсь, вам это тоже поможет!
Я впервые столкнулся с этой ошибкой, пытаясь отладить старый код, работающий сейчас на PHP 7.30. Упрощенный код выглядел так:
$testOK = true;
if ($testOK) {
$x['error'][] = 0;
$x['size'][] = 10;
$x['type'][] = 'file';
$x['tmp_name'][] = 'path/to/file/';
}
Простейшим возможным решением было объявить $ x как array() раньше:
$x = array();
if ($testOK) {
// same code
}
Я верю, что вы спрашиваете о переменной-интерполяции в 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 offset offset as array [...]", потому что то, что вы пытаетесь сделать, на самом деле отправляет сообщение $var[0]
на объект $obj
. И, как вы можете видеть из прибора, нет содержимого $var[0]
. Переменная $var
- это строка и не массив.
В этом случае вы можете использовать фигурные скобки, которые гарантируют, что сначала называется содержимым $var
, а затем остальное сообщение отправлено:
$give_me_foo = $obj->{$var}[0];
Результат "bar"
, как и следовало ожидать.
Ошибка возникает, когда:
$a = array();
$a['text1'] = array();
$a['text1']['text2'] = 'sometext';
Тогда
echo $a['text1']['text2']; //Error!!
Решение
$b = $a['text1'];
echo $b['text2']; // prints: sometext
..