我如何在PHP中以已知数组键重移动数组元素?

问题描述 投票:2回答:1

大脑因一个相当琐碎的问题而陷入僵局。如果我从这样的数组开始:

$my_array = array(
                  1  => array(
                    "id" => 1,
                    "weight" => 0
                    ),
                  2  => array(
                    "id" => 2,
                    "weight" => -1
                    ),
                  3  => array(
                    "id" => 3,
                    "weight" => 0
                    ),
                  4  => array(
                    "id" => 4,
                    "weight" => -1
                    ),
);

并且我将执行将数组键移至键+'权重'的功能。因此结果应该是这样的:

$my_array = array(
                  1  => array(
                    "id" => 2,
                    "weight" => -1
                  ),
                  2  => array(
                    "id" => 1,
                    "weight" => 0
                    ),
                  3  => array(
                    "id" => 4,
                    "weight" => -1
                  ),
                  4  => array(
                    "id" => 3,
                    "weight" => 0
                    ),
);

最有效的方法是什么?

php arrays sorting
1个回答
1
投票

这里是可以帮助某些人的功能

function reorder_array(&$my_array) {   
  foreach ($my_array as $key => $object) {
        $move = $object['weight'];
        $arr = $my_array;
        if ($move == 0 || !isset($arr[$key])) {
          continue;
        }
        $i = 0;
        foreach($arr as &$val){
          $val = array('sort' => (++$i * 10), 'val' => $val);
        }
        if($move == 0 && $key == $key){
          continue;
        }elseif($move == 0) {
          $tmp = $arr[$key]['sort'];
          $arr[$key]['sort'] = $arr[$key]['sort'];
          $arr[$key]['sort'] = $tmp;
        }else{
          $arr[$key]['sort'] = $arr[$key]['sort'] + ($move * 10 + ($key == $key ? ($move < 0 ? -5 : 5) : 0));
        }
        uasort($arr, function($a, $b) {
          return $a['sort'] > $b['sort'];
        });
        foreach($arr as &$val) {
          $val = $val['val'];
        }
        $my_array = $arr;
      }
}

Source of my solution

© www.soinside.com 2019 - 2024. All rights reserved.