【问题标题】:PHP Undefined Index for 2D private array2D私有数组的PHP未定义索引
【发布时间】:2013-10-18 03:33:24
【问题描述】:

我已经被这个问题困扰了一段时间,不确定问题所在。

也许这里有人可能有一些很好的见解?

这里是“代码”:

class File extends Stackable{
    private $data;
    function set_data($array){
        foreach($array as $row => $data)
            foreach($data as $col => $val)
                $this->data[$row][$col]=$val;
                echo $this->data[$row][$col];                    
    } 

}

其中指出echo 上有一个Undefined index : $col,其中$col 通常是一个字母。

$row 可以假定为已设置。

也许我没有提供足够的详细信息,并且可能存在其他依赖项,如果有,请告诉我。

需要注意的一点是这里使用了 php pthreads,虽然我不认为这是原因,因为错误仍然发生在 1 个线程上。

提前感谢您的帮助。

【问题讨论】:

  • 函数开头var_dump($array);的输出是什么?
  • 为什么要这样做?你试图以一种非常奇怪的方式实现$this->data=$array
  • @TheWolf var_dump 只是输出之前输入数组的当前值,这里是一个 2x20 数组
  • @AlmaDoMundo,这个具体的实现会对结果有影响吗?如果是这样,你能澄清一下吗?
  • @Victor.dMdB 您正在遍历您的数组,只是为了用相同的键和值填充您的data。所以我不明白为什么要这样做,如果你可以直接分配数组

标签: php arrays pthreads private


【解决方案1】:

在你的第二次 foreach 您必须将代码放在 {} 之间,例如:

     foreach($data as $col => $val){
                    $this->data[$row][$col]=$val;
                    echo $this->data[$row][$col]; 

}

echo $this->data[$row][$col]; 中,对于每个,$col 和$val 都没有定义。

【讨论】:

  • 嗨@Morteza,感谢您的提示,虽然我最初尝试过,希望它会改变一些东西,但不幸的是它没有
  • victor , 你可以在循环结束后打印_r $this->数据,函数结束然后退出; ,所以你可以找到 $this->data 是否为空,如果不是,你可以使用密钥进行测试。
【解决方案2】:

成员“数据”只是一个普通数组,由于 pthreads 对象的工作方式,您正在失去维度;您不想使用成员“数据”,没有必要:

<?php
class File extends Stackable {

    /* in pthreads you are responsible for the objects you create */
    /* so we accept an array by reference to store dimensions */

    public function set_data($array, &$files){
         foreach($array as $row => $data) {
            foreach($data as $col => $val) {
                 /* force this vector into existence */
                 if (!isset($this[$row])) {
                    $this[$row] = $files[] = new File();
                 }
                 $this[$row][$col]=$val;
            }
         }                  
    } 

    public function run() {}
}

$files = array();

$f = new File();
$f->set_data(array("test" => array($_SERVER)), $files);

var_dump($f);
?>

您应该记住,pthreads 对象需要应对安全性开销,因此尽可能少地循环它们的成员,在理想情况下,到达 setData 的 $array 已经是合适的类型...... .

【讨论】:

  • 感谢您的澄清,我认为这是in pthreads you are responsible for the objects you create,我在第一次误解了它。我已经重新编码,只使用添加到pool而不是共享资源的一维数组,现在一切正常(除了我仍在努力解决的其他方面,即导入的包似乎不是线程安全的)
猜你喜欢
  • 2015-12-15
  • 2011-08-15
  • 2013-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2015-12-05
  • 2012-12-08
相关资源
最近更新 更多