更改值时PHP数组重新排序

更改值时PHP数组重新排序,php,sorting,foreach,Php,Sorting,Foreach,我的解决方案在排序到顶部时有效,但不幸的是,不稳定。我找不到我的错误 当我整理时,我会得到类似的结果,例4到例1: ['sort'] => 1 ['sort'] => 1 ['sort'] => 2 ['sort'] => 3 字段始终正确移动。这个函数的错误在哪里?排序值不应出现两次或两次以上,这一点很重要 功能非常简单 如果用户创建一个新字段或为现有字段更改排序,并且如果该排序编号已经存在,我将移动该字段并对所有其他字段重新排序$sArr['sort'] 排序应始终

我的解决方案在排序到顶部时有效,但不幸的是,不稳定。我找不到我的错误


当我整理时,我会得到类似的结果,例4到例1:

['sort'] => 1
['sort'] => 1
['sort'] => 2
['sort'] => 3

字段始终正确移动。这个函数的错误在哪里?排序值不应出现两次或两次以上,这一点很重要

功能非常简单

如果用户创建一个新字段或为现有字段更改排序,并且如果该排序编号已经存在,我将移动该字段并对所有其他字段重新排序
$sArr['sort']

排序应始终如下所示:

['sort'] => 1
['sort'] => 2
['sort'] => 3
['sort'] => 4
$sArr,我的数组变量:

Array
(
    [0] => Array
        (
            [id] => 58c6bea7c8d666.74251302
            [sort] => 3
            [name] => Field 4
        )

    [1] => Array
        (
            [id] => 58c6beac86a786.66634467
            [sort] => 1
            [name] => Field 2 
        )

    [2] => Array
        (
            [id] => 58c6beb027d915.29472725
            [sort] => 2
            [name] => Field 1 
        )

    [3] => Array
        (
            [id] => 58c6beb755e690.35545890
            [sort] => 4
            [name] => Field 3 
        )

)
$sField:

Array
(
    [id] => 58c6beb755e690.35545890
    [sort] => 1
    [name] => Field 3 
)
PHP:

protectedfunction\u重新排列($sArr、$sField、$sPos)
{
if(!isset($sArr)| |!is_数组($sArr)){
返回false;
}
$sFieldCnt=计数($sArr);
如果($sPos<0 | |$sPos>=$sFieldCnt){
返回false;
}
$iCurrentPos=-1;
对于($i=0;$i<$sFieldCnt;$i++){
如果($sArr[$i]['id']==$sField['id'])){
$iCurrentPos=$i;
打破
}
}
如果($iCurrentPos==-1){
返回false;
}
如果($iCurrentPos==$SPO){
返回true;
}
$sField=$sArr[$iCurrentPos];
如果($iCurrentPos<$SPO){
对于($i=$iCurrentPos;$i<$sPos;$i++){
$sArr[$i]=$sArr[$i+1];
$sArr[$i]['sort']=$i+1;
}
$sArr[$sPos]=$sField;
返回true;
}否则{
对于($i=$iCurrentPos;$i>$sPos;$i--){
$sArr[$i]=$sArr[$i-1];
$sArr[$i]['sort']=$i-1;
}
$sArr[$sPos]=$sField;
返回true;
}
}

我看不到任何问题。我在排序时会得到类似的结果,例如4到1。(1,1,2,3)此函数中的错误在哪里?重要的是排序值不应出现两次或两次以上。
protected function _reArrange($sArr, $sField, $sPos)
{
    if (!isset($sArr) || !is_array($sArr)) {
        return false;
    }
    $sFieldCnt = count($sArr);
    if ($sPos < 0 || $sPos >= $sFieldCnt) {
        return false;
    }
    $iCurrentPos = -1;
    for ($i = 0; $i < $sFieldCnt; $i++) {
        if ($sArr[$i]['id'] === $sField['id']) {
            $iCurrentPos = $i;
            break;
        }
    }
    if ($iCurrentPos == -1) {
        return false;
    }
    if ($iCurrentPos == $sPos) {
        return true;
    }
    $sField = $sArr[$iCurrentPos];
    if ($iCurrentPos < $sPos) {
        for ($i = $iCurrentPos; $i < $sPos; $i++) {
            $sArr[$i] = $sArr[$i + 1];
            $sArr[$i]['sort'] = $i + 1;
        }
        $sArr[$sPos] = $sField;
        return true;
    } else {
        for ($i = $iCurrentPos; $i > $sPos; $i--) {
            $sArr[$i] = $sArr[$i - 1];
            $sArr[$i]['sort'] = $i - 1;
        }
        $sArr[$sPos] = $sField;
        return true;
    }
}