【问题标题】:PHP in-place change a single key in an associative array?PHP就地更改关联数组中的单个键?
【发布时间】:2016-08-21 22:25:25
【问题描述】:

假设我有这个关联数组:

$fruits = array(
 'red'   => 'strawberry',
 'blue'  => 'banana',
 'green' => 'apple',
);

我想将密钥blue 更改为yellow。请注意,我想更改 key,而不是值。我可以这样做:

$fruits['yellow'] = $fruits['blue'];
unset($fruits['blue']);

但这会导致'yellow' => 'banana' 位于数组的end。如果我需要维护数组的顺序,所以'yellow' => 'banana' 与之前的'blue' => 'banana' 处于相同位置,我该怎么做?

当然,我可以重构整个数组,添加所有键/值对并插入 yellow 而不是 blue 键,但这似乎是一种相当缓慢的方式。

是否有更智能/更高效(最好是 PHP 原生)的方法来就地执行此操作?

【问题讨论】:

  • 其实,你所拥有的是正确的。这里没有顺序。这没有任何区别。为什么需要特定的订购?那么你可以使用数字索引对吗?
  • 你必须先了解php中的数组是如何工作的......php.net/manual/en/language.types.array.php
  • @PraveenKumar 除非我弄错了,PHP 数组是有序的吗? (也根据@GeorgePant 的链接?)如果我这样做implode(' ',$fruits),我总是得到相同的结果,即"strawberry banana apple" 按此顺序。
  • @RocketNuts 在拒绝正确答案之前,您应该了解 php 数组的工作原理,因为它不是“智能”/“高效”。如果您了解在 php 中关联数组的顺序只是元素的顺序插入到数组中,那么你就会明白最有效和最聪明的方法是重建数组。
  • @GeorgePant Ehm,我还没有拒绝任何答案?我只对 cpugorou 的回答发表了评论,询问他的回答比我在我的 OP 中已经提出的建议提供了什么。此外,我已经提到我当然可以手动重建数组,我只是想知道 PHP 中是否有一些本机函数或运算符可以做同样的事情。您显然可以就地更改数组中的 values,而我的问题很简单,keys 是否也可以这样做。

标签: php replace key associative-array in-place


【解决方案1】:

以下示例大部分取自array_splice() for associative arrays

$newArray = array_slice($fruits, 0, $offset, true) +
            array('yellow' => 'banana') +
            array_slice($fruits, $offset, NULL, true);

                        print_r($newArray);

如果我们知道“蓝色”键的偏移量,我们可以在其位置添加一个黄色的新键。

所以在你的情况下,偏移量是 1,因为蓝色是数组中的第二个键。

【讨论】:

  • 这不能回答这个问题。在你的回答中告诉你,这与这个问题有什么关系?
【解决方案2】:

一种解决方案是使用 array_keys 获取键,应用一个函数来根据需要更改它们,然后使用 array_combine 将新键与值组合

 $array = array_combine(array_map('replace_key', array_keys($fruits)),  $fruits);

    function replace_key($key){
     if($key=="blue") return "yellow";
     return $key;
     }

另一种解决方案是使用array_walk

 $result = array();
     array_walk($fruits, function (&$value,$key) use (&$result) {
      if($key=="blue") $key="yellow";
      $result[ $key ] = $value;
      });
 print_r($result);

另一种方法(可能更快)是使用foreach 循环并重建数组。如果您想要一个通用的解决方案,只需基于此代码编写一个简单的函数:

 $temp_array=array();

 foreach($fruits as $key=>$value){

 if($key=="blue") $key="yellow";

 $temp_array[$key]=$value;
 }

 $fruits=$temp_array;

【讨论】:

    【解决方案3】:

    最快的方法:

    foreach($fruits as $key=>$value){ 
         If ($key==="blue"){
             $fruits["yellow"]= $value;
             unset($fruits[$key]);
         }
     }
    

    【讨论】:

    • 这怎么比我在我的问题中发布的更快(甚至一样快)? (我的意思是$fruits['yellow'] = $fruits['blue']; unset($fruits['blue']);
    猜你喜欢
    • 1970-01-01
    • 2012-10-25
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 2012-02-25
    • 1970-01-01
    相关资源
    最近更新 更多