更改PHP数组中条目的键

时间:2019-06-01 14:30:26

标签: php arrays

我目前正在尝试构建一个复杂的函数,以对PHP数组中定义的某些节(div)的位置重新排序。

例如,我在这里有这个数组:

$sections = array(
    0 => 'section_one',
    1 => 'section_two',
    2 => 'section_three',
    3 => 'section_four',
    4 => 'section_five',
    5 => 'section_six',
    6 => 'section_seven'
);

结果如下:

array(7) { [0]=> string(11) "section_one" [1]=> string(11) "section_two" [2]=> string(13) "section_three" [3]=> string(12) "section_four" [4]=> string(12) "section_five" [5]=> string(11) "section_six" [6]=> string(13) "section_seven" }

当用户现在在我的网站上将第二部分的第六部分移到第一部分时,我需要将第六部分的键更改为1,并将每个键向后移动一个数字。因此section_two成为密钥2,依此类推...

有人知道我该怎么做吗?我知道我可以这样替换键:

$arr[ $newkey ] = $arr[ $oldkey ];
unset( $arr[ $oldkey ] );

当用户完成元素移动后,我知道了section_six之类的名称以及该元素的新位置。

重新排列/重新放置键之后,数组必须如下所示:

$sections_a = array(
    0 => 'section_one',
    1 => 'section_six',
    2 => 'section_two',
    3 => 'section_three',
    4 => 'section_four',
    5 => 'section_five',
    6 => 'section_seven'
);

2 个答案:

答案 0 :(得分:2)

一种选择是复制数组并使用array_splice

$sections = array(
    0 => 'section_one',
    1 => 'section_two',
    2 => 'section_three',
    3 => 'section_four',
    4 => 'section_five',
    5 => 'section_six',
    6 => 'section_seven'
);

$oldkey = 5;
$newkey = 1;

$sections_a = $sections;
array_splice( $sections_a, $newkey, 0, array_splice( $sections_a, $oldkey, 1) );

这将导致:

Array
(
    [0] => section_one
    [1] => section_six
    [2] => section_two
    [3] => section_three
    [4] => section_four
    [5] => section_five
    [6] => section_seven
)

答案 1 :(得分:1)

我看到@Eddie提供了比我更好的解决方案,谢谢Eddie, 但是这是我为此创建的自定义函数,如果它可以帮助任何人。

// This function returns the new array
function reindexArray($array,       // Array
                      $index,       // Index of the value that you to change the index of
                      $indexToMove) // Index that you want to move that value
{
    // Store the value to be reindex in a variable
    $reIndexedValue = $array[$index];
    // Remove that value from the array
    unset($array[$index]);
    // Reorder the original array
    $oldArrayInOrder = array_values($array);
    // Create a new array
    $newArray = array();
    // Now reindex all the value into the new array in the proper order
    for ($j=0, $i=0; $i < count($oldArrayInOrder)+1; $i++) { 
        if($i == $indexToMove)
        {
            $newArray[$i]=$reIndexedValue; 
            continue;
        }
        else
        {
            $newArray[$i] = $oldArrayInOrder[$j];
            $j++;
        }
    }
    return($newArray);
}