如何使用foreach循环中的函数更新属性?

时间:2013-09-17 22:46:14

标签: php xml function properties parameters

我想在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"
}

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个对象不能以相同的方式使用,可能是因为它们是作为类属性嵌入对象的对象。