我想在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])
相同,但后者为object(SimpleXMLElement)#4 (2)
。
object(SimpleXMLElement)#2 (2) {
["@attributes"]=>
array(1) {
["name"]=>
string(9) "old value"
}
[0]=>
string(1) "2"
}
答案 0 :(得分:1)
您需要使用$element
&
进行foreach ($object->array as &$element) {...}
引用,即
$object->array
没有它,您将操纵{{1}}的副本而不是数组本身。查看references上的PHP文档。
答案 1 :(得分: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's answer关于数组是正确的,但SimpleXMLElement
个对象不能以相同的方式使用,可能是因为它们是作为类属性嵌入对象的对象。