0

我想在foreach循环中更改对象的一些属性:

foreach ($object->array as $element) {
    $element['foo'] = $new_foo;
    $element['bar'] = $new_bar;
}

我应该如何使用函数来做到这一点?否则我怎么能用面向对象的方法做到这一点?我的代码不起作用,因为它只会更改函数中$handle变量的值:

function change_attribute(&$handle, $new_value) {
    $handle = $new_value;
}

foreach ($object->array as $element) {
    change_attribute($element['foo'], $new_foo);
    change_attribute($element['bar'], $new_bar);
}

实际代码

foreach ($xml->database[0]->table as $table) {
    $table->column[1]['name'] = 'new value';
}

它在不引用数组元素的情况下成功更新了$xml对象(这会导致致命错误)。为什么我不能对这个功能做同样的事情?

function change_attribute(&$handle, $old, $new) {
    if ($handle == $old) {
        $handle = $new;
    }
}

foreach ($xml->database[0]->table as $table) {
    change_attribute($table->column[1]['name'], 'old value', 'new value');
}

$xml对象_

php > var_dump($xml->database[0]->table);
object(SimpleXMLElement)#2 (2) {
  ["@attributes"]=>
  array(1) {
    ["name"]=>
    string(7) "objects"
  }
  ["column"]=>
  array(5) {
    [0]=>
    string(4)
    [1]=>
    string(1)
    [2]=>
    string(17)
    [3]=>
    string(17)
    [4]=>
    string(1949)
  }
}

var_dump($xml->database[0]->table[0])除了后面的 is 之外,这与 相同object(SimpleXMLElement)#4 (2)

object(SimpleXMLElement)#2 (2) {
  ["@attributes"]=>
  array(1) {
    ["name"]=>
    string(9) "old value"
  }
  [0]=>
  string(1) "2"
}
4

2 回答 2

1

您需要使用 进行$element参考&,即

foreach ($object->array as &$element) {...}

没有它,您将操作数组的副本$object->array而不是数组本身。查看有关参考的 PHP 文档。

于 2013-09-17T22:55:16.447 回答
0

我必须将对象传递给函数而不是类属性。不幸的是,后者必须在函数中硬编码:

function change_column_name(&$table, $index, $old, $new) {
    if ($table->column[$index]['name'] == $old) {
        $table->column[$index]['name'] = $new;
    }
}

foreach ($xml->database[0]->table as $table) {
    change_column_name($table, 1, 'old value', 'new value');
}

George Brighton对数组的回答是正确的,但SimpleXMLElement对象不能以相同的方式使用,可能是因为它们是作为类属性嵌入到对象中的对象。

于 2013-09-23T15:45:32.270 回答