根据另一个查找/映射数组替换数组中的键

420

我有一个形式为key => value的关联数组,其中键是数字值,但它不是顺序数字值。实际上,键是一个ID号码,而值是一个计数。这在大多数情况下都很好,但是我想要一个函数,该函数获取数组的可读名称并将其用作键,而不更改值。

我没有看到可以完成此任务的函数,但我假设我需要提供旧键和新键(我都有),并转换数组。有没有一种有效的方法来实现这个?


请参考以下链接:https://dev59.com/onVC5IYBdhLWcg3wZwJT - Peter Krauss
25个回答

1
最好的方法是使用引用,而不是使用unset(这将导致另外一步来清理内存)。
$tab = ['two' => [] ];

解决方案:
$tab['newname'] = & $tab['two'];

你有一个原始文件和一个带新名称的参考文件。
或者,如果你不想在一个值中拥有两个名称,可以创建另一个标签,并对参考文件进行循环。
foreach($tab as $key=> & $value) {
    if($key=='two') { 
        $newtab["newname"] = & $tab[$key];
     } else {
        $newtab[$key] = & $tab[$key];
     }
}

使用键进行迭代比克隆整个数组更好,并且如果您有长达100行等的长数据,则清除旧数组。


如果您只是要创建一个新的数组,我看不出涉及引用的好处。 - mickmackusa

0

一个保持顺序易于理解的简单方法:

function rename_array_key(array $array, $old_key, $new_key) {
  if (!array_key_exists($old_key, $array)) {
      return $array;
  }
  $new_array = [];
  foreach ($array as $key => $value) {
    $new_key = $old_key === $key
      ? $new_key
      : $key;
    $new_array[$new_key] = $value;
  }
  return $new_array;
}

0

这是一个实验(测试)

初始数组(键如0、1、2)

$some_array[] = '6110';//
$some_array[] = '6111';//
$some_array[] = '6210';//

我必须更改键名,例如human_readable15human_readable16human_readable17

类似于已发布的内容。在每个循环中,我设置必要的键名并从初始数组中删除相应的键。

例如,我将$some_array插入mysql,得到lastInsertId,我需要将键值对发送回jquery。

$first_id_of_inserted = 7;//lastInsertId
$last_loop_for_some_array = count($some_array);


for ($current_loop = 0; $current_loop < $last_loop_for_some_array ; $current_loop++) {

$some_array['human_readable'.($first_id_of_inserted + $current_loop)] = $some_array[$current_loop];//add new key for intial array

unset( $some_array[$current_loop] );//remove already renamed key from array

}

这里是新数组,带有重命名的键

echo '<pre>', print_r($some_array, true), '</pre>$some_array in '. basename(__FILE__, '.php'). '.php <br/>';

如果需要其他的而不是human_readable15、human_readable16和human_readable17,那么可以创建类似以下的内容。
$arr_with_key_names[] = 'human_readable';
$arr_with_key_names[] = 'something_another';
$arr_with_key_names[] = 'and_something_else';


for ($current_loop = 0; $current_loop < $last_loop_for_some_array ; $current_loop++) {

    $some_array[$arr_with_key_names[$current_loop]] = $some_array[$current_loop];//add new key for intial array

    unset( $some_array[$current_loop] );//remove already renamed key from array

    }

请注意在问题正文中回答问题,而不仅仅是回答问题标题。从我的答案中您会发现,这个问题并不仅仅想要使用array_combine()函数合并两个数组,而是要使用查找重新对一个数组进行键名重组。 - mickmackusa
也许我误解了问题。我遇到了类似的问题并写出了我的解决方案。据我理解,问题是要保持数组键的相同顺序、相同值,但需要更改数组键的名称。我发布的代码似乎解决了所有这些问题。 - Andris

-1

您可以编写一个简单的函数,将回调应用于给定数组的键。类似于array_map

<?php
function array_map_keys(callable $callback, array $array) {
    return array_merge([], ...array_map(
        function ($key, $value) use ($callback) { return [$callback($key) => $value]; },
        array_keys($array),
        $array
    ));
}

$array = ['a' => 1, 'b' => 'test', 'c' => ['x' => 1, 'y' => 2]];
$newArray = array_map_keys(function($key) { return 'new' . ucfirst($key); }, $array);

echo json_encode($array); // {"a":1,"b":"test","c":{"x":1,"y":2}}
echo json_encode($newArray); // {"newA":1,"newB":"test","newC":{"x":1,"y":2}}

这里有一个要点 https://gist.github.com/vardius/650367e15abfb58bcd72ca47eff096ca#file-array_map_keys-php


提问者并不打算仅仅在原始键前添加一个字符串。请重新阅读问题要求。输入数组的键必须被另一个数组中的相关值替换。最多,这个答案是对另一个问题的正确回答。从表面上看,这个答案是完全错误的。 - mickmackusa

-1

嗯,我之前没有测试过,但我认为这段代码可以工作。

function replace_array_key($data) {
    $mapping = [
        'old_key_1' => 'new_key_1',
        'old_key_2' => 'new_key_2',
    ];

    $data = json_encode($data);
    foreach ($mapping as $needed => $replace) {
        $data = str_replace('"'.$needed.'":', '"'.$replace.'":', $data);
    }

    return json_decode($data, true);
}

1
Json编码和解码?这是一个非常糟糕的答案。 - adamkonrad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接