【问题标题】:php Cannot use string offset as an array even if var is an array即使var是数组,php也不能将字符串偏移量用作数组
【发布时间】:2017-02-21 07:47:56
【问题描述】:

读取特殊键时出现此错误,但我的 var 是数组。

这是我的代码:

while($d <= count($nom)) {
    $last_d=$d;
    $nomdata = 'data_'.$d;
    $$nomdata = array();

    $di = 1;
    while($di <= count($data)) {
       if($data[$di][2] == sprintf('%08d', $d)) {
           array_push($$nomdata,$data[$di]);
       }
       $di++;
    }

    if(!empty($$nomdata)) {
        # THIS WON'T WORK -> echo '<br>i:'.$$nomdata[1][2].'<br>';
        # BUT THIS IS WORKING ↓
        print_r($$nomdata);
    }

    $d++;
}

当我 print_r 时,我得到了我想要的多维数组。

Array
(
[0] => Array
    (
        [0] => 01556
        [1] => 1
        [2] => 00000002
        [3] =>           
        [4] => 34
        [5] => 0
        [6] => 2016/09/01  10:19:11
    )

[1] => Array
    (
        [0] => 01566
        [1] => 1
        [2] => 00000002
...

但是当我调用 $$nnomdata[1][2],(或 $data_2[1][2])时,我有这个错误:

Fatal error: Cannot use string offset as an array

我真的不明白。第一个数组 $data 是相同类型(多维),一切正常。我可以读取$data[1][2],但是由于我在$data_1,$data_2中传输它,所以我不能再这样读取它了。但是当我 print_r 时,这些键似乎没问题。

提前致谢。

【问题讨论】:

  • 你的代码中有很多$$。您确定要这样做吗?
  • 如果您使用 $$,您可能应该只使用数组。你有什么理由不只是为你的数组添加一个维度?
  • 还有哪一行会抛出这个错误?
  • @Machavity :是的,有变量。
  • @bluegman991 我有一个多维数组 $data 。我想将所有具体行($data[$i][2] 是我要查找的 ID 的行)放在特定数组 $data_$ID

标签: php arrays string multidimensional-array


【解决方案1】:

这可能发生在较旧的 php 版本中。 $nomdata 是字符串

当您访问$$nomdata 时,php 按存储在$nomdata 中的名称返回变量

当您访问$$nomdata[x] 时,php 尝试获取$nomdata[x] 作为变量名

PHP 5.0 示例

<?php

$test = array(1, 2, 3, 4, 5, 6, 7, 8, 9);

$array = 'test';

var_dump( $$array );    // array
var_dump( $$array[0] ); // Undefined variable: t
var_dump( $$array[5] ); // Uninitialized string offset:  5

PHP 7.0.5 示例

$test = array(1, 2, 3, 4, 5, 6, 7, 8, 9);

$array = 'test';

var_dump( $$array );    // array
var_dump( $$array[0] ); // int(1)
var_dump( $$array[5] ); // int(6)

解决方案

$myArray = $$nomdata;
var_dump($myArray[5]); //now you can access array fields

// if you want to modify them, you will need to create reference
$myArray = &$$nomdata;
$myArray[0] = 'some value'; // this will affect your source array

【讨论】:

  • 谢谢,但问题是,在我的代码之后(如果我抛出调用数组的两行)。我还有别的事。并尝试调用 $data_1,因为 $$nomdata 是 $data_$i。我怎样才能访问它们?再次感谢。
  • 啊!您是说我应该尝试使用 PHP 7+ 吗?
  • @hellodracon 使您的变量像这样:$myArray = &amp;$$nomdata; 然后更改将影响源数组
  • 你怎么称呼这个?当你把 & 放在变量 varbiable 之前?
  • @hellodracon:这里的根本问题是$$nomdata[1][2] 是模棱两可的;根据解析器处理它的顺序,它可能意味着不同的东西。与 PHP5 相比,PHP7 更改了处理顺序,这将改变您的代码的工作方式。解决方案是使用大括号或方括号向解析器阐明您的意思。你需要这样写:($$nomdata)[1][2]。那将为您解决。但是,我也建议不要使用这样的变量;在 10 个案例中,有 8 个是不良编码风格的典型标志,而这绝对是 8 个之一。
【解决方案2】:

查看您已注释掉的行,我已更改为适合您的内容。基本上 PHP 有一个定义的顺序来解析变量变量,这在 php 版本之间确实不同。

while($d <= count($nom)) {
    $last_d=$d;
    $nomdata = 'data_'.$d;
    $$nomdata = array();

    $di = 1;
    while($di <= count($data)) {
       if($data[$di][2] == sprintf('%08d', $d)) {
           array_push($$nomdata,$data[$di]);
       }
       $di++;
    }

    if(!empty($$nomdata)) {
        # THIS WON'T WORK -> echo '<br>i:'.{$$nomdata}[1][2].'<br>';
        # BUT THIS IS WORKING ↓
        print_r($$nomdata);
    }

    $d++;
}

【讨论】:

  • Nop :( 我得到了这个:语法错误,第 156 行 /home/lekalif/www/heures.php 中的意外“{”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多