我正试图从数据库调用生成一个XML,而我使用的实用程序类抛出一个错误Illegal character in tag name. tag: 0
我想这是因为数组是[0]、[1]、[2]等。真的,我应该把它们都设置为标准的东西,比如"asset",因为它们都是资产,但我不能这样做,因为这样键就会相同,但ID可能会起作用。但我不知道如何在foreach循环中更改我所使用的键。
我试过了:
foreach ($assets as &$key => &$asset) {
$key2 = $asset->isci;
$asset = get_object_vars($asset);
}
但我无法传递$key的引用。
这是阵列外观的简要表示:
array(2) {
[0]=>
array(25) {
["id"]=>
string(2) "27"
}
[1]=>
array(25) {
["id"]=>
string(2) "25"
}
[2]=>
array(25) {
["id"]=>
string(1) "1"
}
}
在数组上循环时修改数组的键通常是个坏主意——即使语言支持它,调试也会非常混乱。
最简单的方法是简单地在旧阵列的基础上构建一个新阵列,但要使用更好的密钥:
$rekeyed_assets = array();
foreach ($assets as $old_key => $asset)
{
$new_key = $asset->isci;
$asset = get_object_vars($asset);
$rekeyed_assets[ $new_key ] = $asset;
}
最方便的方法是更改所有键,然后使用array_combine
用修改后的键创建一个新数组。以下是如何使用array_map
和匿名函数批量实现这一点
$newKeys = array_map(function($asset) { return $asset->isci; }, $assets);
$assets = array_combine($newKeys, $assets);
您也可以对值执行相同操作:
$newKeys = array_map(function($asset) { return $asset->isci; }, $assets);
$newValues = array_map(function($asset) { return get_object_vars($asset); }, $assets);
$assets = array_combine($newKeys, $newValues);
这种方法确实有一个缺点(增加了内存使用量),如果您的数组有数百万个项目,这可能是一个问题,但在这种情况下,很可能最好重组程序,这样它就不需要在内存中保留巨大的数组。