【问题标题】:Moving array element to top in PHP在PHP中将数组元素移动到顶部
【发布时间】:2018-08-03 11:54:26
【问题描述】:
$arr = array(
    'a1'=>'1',
    'a2'=>'2'
);

我需要将 a2 移到顶部,并保留 a2 作为关键我将如何继续它我似乎无法在不搞砸的情况下想办法:)

【问题讨论】:

  • 你到底想做什么?是否按相反的数字顺序对数组进行排序?
  • 你解决问题了吗?
  • 是的,但是您需要等待几分钟才能将 thnx m8 标记为已接受

标签: php arrays element


【解决方案1】:

这是一个适用于数字键和字符串键的解决方案:

function move_to_top(&$array, $key) {
    $temp = array($key => $array[$key]);
    unset($array[$key]);
    $array = $temp + $array;
}

之所以有效,是因为 PHP 中的数组是有序映射。
顺便说一句,将项目移动到底部使用:

function move_to_bottom(&$array, $key) {
    $value = $array[$key];
    unset($array[$key]);
    $array[$key] = $value;
}

【讨论】:

  • 一个更好的答案,因为它不假定要移动的键在末尾。
【解决方案2】:

您可以通过这种方式实现:

$arr = array(
    'a1'=>'1',
    'a2'=>'2'
);

end($arr);

$last_key     = key($arr);
$last_value   = array_pop($arr);
$arr          = array_merge(array($last_key => $last_value), $arr);

/*
    print_r($arr);

    will output (this is tested):
    Array ( [a2] => 2 [a1] => 1 )
*/

【讨论】:

  • 完全正确:如果数组包含数字键,则键将被修改。
  • 仍然不完全正确:array_mergerenumber numeric keys。不过,可能已经足够有用了。
  • @awm:键值不是数字。我的print_r() 输出是Array ( [a2] => 2 [a1] => 1 )
  • 没错。这就是为什么这个解决方案可能足以完成工作的原因。不过,乔恩的第一条评论仍然正确。
  • 这无法扩展。如果您有一个包含 5 个键的数组,并且您想将第 3 个键移到顶部怎么办?
【解决方案3】:

试试这个:

$key = 'a3';
$arr = [
    'a1' => '1',
    'a2' => '2',
    'a3' => '3',
    'a4' => '4',
    'a5' => '5',
    'a6' => '6'
];
if (isset($arr[ $key ]))
    $arr = [ $key => $arr[ $key ] ] + $arr;

结果:

array(
    'a3' => '3',
    'a1' => '1',
    'a2' => '2',
    'a4' => '4',
    'a5' => '5',
    'a6' => '6'
)

【讨论】:

  • 啊,简单,优雅,完美!
  • 它就像一个魅力。谢谢
【解决方案4】:

这是使用array_splice()union 运算符完成此任务的简单方法:

$arr = array('a1'=>'1', 'a2'=>'2', 'a3' => '3');
$arr = array_splice($arr,array_search('a2',array_keys($arr)),1) + $arr;

编辑:

回想起来,我不确定我为什么不这样做:

$arr = array('a2' => $arr['a2']) + $arr;

更干净、更容易,而且可能更快。

【讨论】:

    【解决方案5】:

    您还可以查看array_multisort 这使您可以使用一个数组对另一个数组进行排序。例如,这可以让您将硬编码的值排序外部化到配置文件中。

    <?php
       $ar1 = array(10, 100, 100, 0);
       $ar2 = array(1, 3, 2, 4);
       array_multisort($ar1, $ar2);
    
       var_dump($ar1);
       var_dump($ar2);
    ?>
    

    在本例中,经过排序后,第一个数组将包含 0、10、100、100。第二个数组将包含 4、1、2、3。第二个数组中的条目对应于第一个数组中的相同条目数组(100 和 100)也已排序。

    输出:

    array(4) {
      [0]=> int(0)
      [1]=> int(10)
      [2]=> int(100)
      [3]=> int(100)
    }
    array(4) {
      [0]=> int(4)
      [1]=> int(1)
      [2]=> int(2)
      [3]=> int(3)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      • 1970-01-01
      相关资源
      最近更新 更多