1

データベース呼び出しから XML を生成しようとしていますが、使用しているユーティリティ クラスがエラーをスローします。Illegal character in tag name. tag: 0

これは、配列が[0]、[1]、[2]などであることが原因であると考えました。実際には、それらはすべてアセットであるため、「アセット」などの標準に設定する必要がありますが、それはできませんその場合、キーは同一になりますが、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"
  }
}
4

2 に答える 2

2

ループ中に配列のキーを変更することは、一般的に悪い考えです。言語がサポートしていたとしても、デバッグが非常に混乱する可能性があります。

最も簡単な方法は、古い配列に基づいて新しい配列を作成することですが、より良いキーを使用します。

$rekeyed_assets = array();
foreach ($assets as $old_key => $asset)
{
    $new_key = $asset->isci;
    $asset = get_object_vars($asset);

    $rekeyed_assets[ $new_key ] = $asset;
}
于 2012-09-11T18:12:32.897 に答える
1

最も便利な方法は、すべてのキーを変更してから、を使用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);

この方法には欠点(メモリ使用量の増加)があり、配列に数百万のアイテムがある場合に問題になる可能性がありますが、その場合は、巨大な配列を保持する必要がないようにプログラムを再構築する方がよい可能性が高くなります。そもそもメモリ内。

于 2012-09-11T18:10:56.383 に答える