Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Для 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 фактически)

Изменить

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

Поскольку 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

Ответ 2

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

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

После смены:

$params = '';

чтобы:

$params = array();

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

Ответ 3

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

В методе __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.

Ответ 4

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

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

$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

Ответ 5

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

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

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

Ответ 6

Я имел эту ошибку, и был чокнутый

мой код был

$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, так что будьте внимательны! и спасибо молодому Майклу, надеюсь, вам это тоже поможет!

Ответ 7

Я впервые столкнулся с этой ошибкой, пытаясь отладить старый код, работающий сейчас на 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
}

Ответ 8

Я верю, что вы спрашиваете о переменной-интерполяции в 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", как и следовало ожидать.

Ответ 9

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

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

Тогда

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

Решение

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

..