【问题标题】:PHP class function will not change an arrayPHP 类函数不会改变数组
【发布时间】:2011-01-19 00:04:18
【问题描述】:

我是 PHP 和一般编程新手。我一直在用 PHP 做一些需要我创建类的事情,这很好,除了我似乎无法让我的类方法在作为类属性的数组上工作。我肯定做错了什么,因为不管项目如何,它似乎都不起作用。

这是我刚刚写的一个示例(我认为发布一个简短的示例而不是我的实际项目的代码会更容易,因为它有点长且涉及)。

class Test {
    public $testArray;
    public $testInt;

    public function __construct() {
        $this->testArray = array();
        for ($i=1; $i<=20; $i++) {
            $this->testArray[] = array(1, 2);
        }
        $this->testInt = 4;
    }

    public function testf() {
        $this->testInt += 1;
        foreach ($this->testArray as $n) {
            $n[] = 3;
        }
    }
}

如果我在最后添加一些代码,以便打印出正在发生的事情:

$obj = new Test;

echo 'Before function call:';
echo '<br />testArray:<br />';
foreach ($obj->testArray as $n) {
    print_r($n);
    echo '<br />';
}
echo '<br />testInt: ';
echo $obj->testInt;
echo '<br />';
echo '<br />';
echo '<br />';

$obj->testf();

echo 'After function call:';
echo '<br />testArray:<br />';
foreach ($obj->testArray as $n) {
    print_r($n);
    echo '<br />';
}
echo '<br />testInt: ';
echo $obj->testInt;
echo '<br />';

那么你最终看到的是,在函数调用之后,testInt 变量发生了变化,但 testArray 没有变化。

如果其中任何内容不够清楚,请告诉我。这让我发疯了一段时间。提前感谢您抽出宝贵时间查看我的问题。

【问题讨论】:

    标签: php arrays oop methods


    【解决方案1】:

    您需要在 foreach 循环中添加一些内容:

      foreach ($this->testArray as &$n) {
            $n[] = 3;
        }
    

    应该这样做。 &$n 表示引用数组元素而不是复制它。如果要覆盖它,您可能还想将 $n[] 更改为 $n。

    【讨论】:

    • 本,你优雅的回答并没有被我忽视:D
    【解决方案2】:

    当你这样做时:

        foreach ($this->testArray as $n) {
            $n[] = 3;
        }
    

    您没有修改 testArray 的值。你正在制作它们的副本。每当您在 PHP 中将一个值分配给另一个变量时,您就是在制作该值的副本。 (对象是一个例外,但这与这里无关。)

    如果你想修改原来的,你需要通过它自己的变量名来引用它,像这样:

        foreach ($this->testArray as $index => $value) {
            $this->testArray[$index][] = 3;
        }
    

    【讨论】:

    • 谢谢,真的很有帮助,真的很感激。
    猜你喜欢
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多