2010-02-19 1 views
0

Я новичок в PHP и программировании в целом. Я работал над несколькими вещами с 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 нет.

Пожалуйста, дайте мне знать, если что-либо из этого недостаточно ясно. Это немного сбило меня с ума. Заранее благодарю вас за то, что нашли время, чтобы взглянуть на мою проблему.

ответ

3

Когда вы сделаете это:

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

Вы не изменяя значения testArray в. Вы работаете над их копиями. Каждый раз, когда вы назначаете значение в PHP другой переменной, вы делаете копию значения. (Объекты являются своего рода исключение, но это не имеет значения здесь.)

Если вы хотите изменить оригинал, вам нужно обратиться к нему по своим собственным именем переменной, например:

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

Спасибо, что действительно полезно, очень цените это. – 2010-02-19 23:08:20

4

Вам нужно добавить кое-что к петле Еогеасп:

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

это должно сделать это. & $ n означает ссылку на элемент массива, а не его копирование. Вероятно, вы также захотите изменить $ n [] на $ n, если вы хотите перезаписать его.

+0

Бен, ваш элегантный ответ не остался незамеченным мной: D –

Смежные вопросы