【问题标题】:Reverse array values while keeping keys在保留键的同时反转数组值
【发布时间】:2013-01-17 00:57:21
【问题描述】:

这是我拥有的一个数组:

$a = array('a' => 'a1', 'b' => 'a2', 'c' => 'a3', 'd' => 'a4', 'e' => 'a5');

我想做的是反转数组的值,同时保持键不变,换句话说,它应该是这样的:

$a = array('a' => 'a5', 'b' => 'a4', 'c' => 'a3', 'd' => 'a2', 'e' => 'a1');

我应该怎么做?

附:我尝试使用array_reverse(),但它似乎不起作用

【问题讨论】:

  • 这是可能的,这很酷,在下面看到它作为一个班轮也很酷。您希望保持密钥相同但反转数据的用例是什么?

标签: php arrays reverse


【解决方案1】:

可以使用array_combinearray_valuesarray_keysarray_values。对于一个简单的任务来说,可能看起来有很多功能,但可能有更简单的方法。

array_combine( array_keys( $a ), array_reverse( array_values( $a ) ) );

【讨论】:

  • 你的一个班轮真漂亮,谢谢你教我!
【解决方案2】:

使用原生 PHP 函数的一些分步处理(这可以用更少的变量进行压缩):

$a = array('a' => 'a1', 'b' => 'a2', 'c' => 'a3', 'd' => 'a4', 'e' => 'a5');

$k = array_keys($a);
$v = array_values($a);

$rv = array_reverse($v);

$b = array_combine($k, $rv);

var_dump($b);

结果:

array(5) {
  'a' =>
  string(2) "a5"
  'b' =>
  string(2) "a4"
  'c' =>
  string(2) "a3"
  'd' =>
  string(2) "a2"
  'e' =>
  string(2) "a1"
}

【讨论】:

  • array_reverse 实际上有第二个参数preserve keys,它在一次调用中完全一样。 $rv = array_reverse($v, true);
  • @lifecoder 你错过了问题的中心点:键不应该颠倒,只有值。
【解决方案3】:

我认为这应该可行..

<?php
$old = array('a' => 'a1', 'b' => 'a2', 'c' => 'a3', 'd' => 'a4', 'e' => 'a5');
$rev = array_reverse($old);

foreach ($old as $key => $value) {
    $new[$key] = current($rev);
    next($rev);
}

print_r($new);
?>

【讨论】:

    【解决方案4】:

    这里是另一种方式;

    $keys = array_keys($a);
    $vals = array_reverse(array_values($a));
    foreach ($vals as $k => $v) $a[$keys[$k]] = $v;
    

    【讨论】:

      【解决方案5】:

      这样就可以了(刚刚写的,demo here):

      <?php
      function value_reverse($array)
      {
          $keys = array_keys($array);
          $reversed_values = array_reverse(array_values($array), true);
          return array_combine($keys, $reversed_values);
      }
      
      $a = array('a' => 'a1', 'b' => 'a2', 'c' => 'a3', 'd' => 'a4', 'e' => 'a5');
      
      print_r( value_reverse($a) );
      

      【讨论】:

      • 函数有错别字,已修复
      • @guidod 您的编辑是正确的,但通常建议的编辑会被拒绝。有关此事的更多讨论,请参阅meta上的this question
      猜你喜欢
      • 2017-06-11
      • 2015-06-30
      • 2013-03-16
      • 1970-01-01
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      • 2019-07-18
      • 2013-05-23
      相关资源
      最近更新 更多