【问题标题】:How to rename the key in a foreach loop?如何重命名foreach循环中的键?
【发布时间】:2012-09-04 17:17:50
【问题描述】:

我正在尝试从数据库调用生成 XML,而 utility class I'm using 抛出错误 Illegal character in tag name. tag: 0

我认为这是因为数组是 [0]、[1]、[2] 等。真的我应该将它们都设置为标准的东西,比如“资产”,因为它们都是资产,但我可以t 这样做是因为密钥将是相同的,但也许 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"
  }
}

【问题讨论】:

  • 也许$assets['bla']=$asset;unset($assets[$key]);

标签: php xml foreach


【解决方案1】:

在循环遍历数组时修改键通常是个坏主意 - 即使语言支持它,调试起来也很混乱。

最简单的方法是在旧数组的基础上简单地构建一个新数组,但使用更好的键:

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

    $rekeyed_assets[ $new_key ] = $asset;
}

【讨论】:

    【解决方案2】:

    最方便的方法是更改​​所有键,然后使用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);
    

    这种方法确实有一个缺点(增加内存使用),如果您的数组有数百万个项目,这可能是一个问题,但在这种情况下,很有可能重组程序以便它不需要首先将巨大的数组保存在内存中。

    【讨论】:

    • 虽然array_map 可以是一个强大的工具,但它可能会导致一些相当难以阅读的代码,而简单的foreach 循环将同样有效。
    猜你喜欢
    • 2016-09-10
    • 2018-06-15
    • 2021-10-23
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 2021-05-28
    • 2018-07-16
    相关资源
    最近更新 更多