Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中移动具有已知数组键权重的数组元素?_Php_Arrays_Sorting - Fatal编程技术网

如何在PHP中移动具有已知数组键权重的数组元素?

如何在PHP中移动具有已知数组键权重的数组元素?,php,arrays,sorting,Php,Arrays,Sorting,因为一个相当琐碎的问题而头脑僵硬。如果我从这样的数组开始: $my_array = array( 1 => [ "id" => 1, "weight" => 0 ], 2 => [ "id" => 2, "weight" => -1 ], 3 => [ "id" => 3, "weight" => 0

因为一个相当琐碎的问题而头脑僵硬。如果我从这样的数组开始:

$my_array = array(
    1  => [
        "id" => 1,
        "weight" => 0
    ],
    2  => [
        "id" => 2,
        "weight" => -1
    ],
    3  => [
        "id" => 3,
        "weight" => 0
    ],
    4  => [
        "id" => 4,
        "weight" => -1
    ],
);
$my_array = array(
    1  => [
        "id" => 2,
        "weight" => -1
    ],
    2  => [
        "id" => 1,
        "weight" => 0
    ],
    3  => [
        "id" => 4,
        "weight" => -1
    ],
    4  => [
        "id" => 3,
        "weight" => 0
    ],
);
我将执行一个函数,将数组中的键移动到key+“weight”。所以结果可能是这样的:

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

做这件事最有效的方法是什么?

如果它能帮助一些人,这里是函数

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);
        }
         $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;
      }
}
函数重新排序_数组(&$my_数组){
foreach($key=>$object的my_数组){
$move=$object['weight'];
$arr=$my_数组;
如果($move==0 | |!isset($arr[$key])){
继续;
}
$i=0;
外汇($arr as和$val){
$val=array('sort'=>(++$i*10),'val'=>$val);
}
$arr[$key]['sort']=$arr[$key]['sort']+($move*10+($key==$key?($move<0?-5:5):0));
uasort($arr,函数($a,$b){
返回$a['sort']>$b['sort'];
});
外汇($arr as和$val){
$val=$val['val'];
}
$my_数组=$arr;
}
}

钥匙是否需要更换?还是说这是合理的?我看到您将
重量
更改为
位置
介于两者之间。因此,
array\u map
usort
的组合应该可以做到这一点。是的,很抱歉我忘记了一些编辑,我做了一个更好的示例,我只能在更简单的情况下更改顺序,感谢这些函数,我将看看我能做些什么。请开始使用简短的数组语法
[]
。没有必要改用
array()