【问题标题】:How to change the index name of array如何更改数组的索引名称
【发布时间】:2013-08-29 03:47:40
【问题描述】:

我有一个多维数组,

我正在根据需要递归更改数组的值。

它适用于不是数组的键。

但不适用于数组键。

我怎样才能改变一的值来测试像 "one" => "test",

$arr = array(
      'one' => array(
            array('something' => 'value'),
            array('something2' => 'value2'),
            'another' => 'anothervalue'
            ),
      'two' =>  array(
            array('something' => 'value'),
            array('something2' => 'value2'),
            'another' => 'anothervalue'
            )
       );

function update_something(&$item, $key)
{
    if($key == 'one')
        $item = 'test';
}

array_walk_recursive($arr, 'update_something');

预期的阵列结构是

array(
          'one' => 'test',
          'two' =>  array(
                array('something' => 'value'),
                array('something2' => 'value2'),
                'another' => 'anothervalue'
                )
           );

更新2

$html_structure = array(
    array(
        'tag' => 'div',
        'class' => 'lines',
        array(
            'tag' => 'div',
            'one' => array(
                'tag' => 'div',
                 array(
                    'tag' => 'span',
                    'style' => 'margin:10px; padding:10px',
                    'key' => 'title',
                ),
                'key' => 'subject',
            )
        )
    )
);

更新3

$array = array(
    array(
        'tag' => 'div',
        'class' => 'lines',
        array(
            'tag' => 'div',
            'repeat' => array(
                'tag' => 'div',
                 array(
                    'tag' => 'span',
                    'style' => 'margin:10px; padding:10px',
                    'key' => 'title',
                ),
                'key' => 'subject',
            )
        )
    )
);



function update_recursively($array, $key = '', $value = array()) {
    //print_r($array); print_r($value);
    foreach ($array as $k => $v) {
        if ($k === $key){ 
            $array[$k] = $value;
        }
        elseif (is_array($v))
            $array[$k] = update_recursively($v);
    }
    return $array;
}

print_r(update_recursively($array, 'repeat', array('d' => 'a')));

【问题讨论】:

  • @Marcus 这是你的函数你能解决这个问题吗?
  • 您提到了预期的数组结构,但您得到的结构是什么?
  • @StephenTG 此功能失败。它返回我给它的东西。
  • 查看文档,它非常清楚地指出“任何包含数组的键都不会传递给函数。”,所以在update_something $key 永远不会设置为“一”。这就是 array_walk_recursive 的行为。
  • @SilverSnake 是否可以使用其他功能?

标签: php arrays multidimensional-array arraylist


【解决方案1】:

如果你的数组不是太大,这样的事情会起作用:

function update_recursively($array) {
    foreach ($array as $k => $v) {
        if ($k === 'one')
            $array[$k] = 'test';
        elseif (is_array($v))
            $array[$k] = update_recursively($v);
    }

    return $array;
}

$updated_arr = update_recurisvely($arr);

但是如果它真的很大,你需要小心一点,因为它会变得很慢并且占用大量内存。请注意,它不会像 array_walk_recursive 那样更新您的旧数组,而是返回一个更新的版本。

* 更新 *

处理 Update3 场景的版本,我们指定要查找的键和替换它的值。

function update_recursively($array, $key = '', $value = array()) {
    foreach ($array as $k => $v) {
        if ($k === $key)
            $array[$k] = $value;
        elseif (is_array($v))
            $array[$k] = update_recursively($v, $key, $value);
    }
    return $array;
}

【讨论】:

  • 这很好用。但我无法为 UPDATE2 运行它可能有什么问题?
  • @DenizPorsuk 问题是您的数组没有任何键,并且 0 == 'one',我更新了代码,以便第一个 IF 使用 === 代替,这应该可以解决您的问题更新2。
  • SilverSnake 你救了我的命,但是我做什么,我都无法运行 UPDATE3 有什么问题吗?
  • @DenizPorsuk 您更新了 update_recursively() 以获取键和值,elseif 中的行再次调用自身,也需要传递 $key 和 $value。当它在您的代码中递归时,它会停止寻找“重复”并开始寻找“”(默认值)。将$array[$k] = update_recursively($v); 更改为$array[$k] = update_recursively($v, $key, $value);,你应该会很好!
【解决方案2】:

你可以试试:

function update_something(&$item, $key) {
    if($key == 'one') {
        array_splice($item,0,'test');
    }
}

【讨论】:

  • 杰拉德你有其他选择吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
  • 2019-06-18
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 2016-12-05
相关资源
最近更新 更多