如何将数组值添加到关联数组的中间?

2022-08-30 14:11:07

假设我有这个数组:

$array = array('a'=>1,'z'=>2,'d'=>4);

稍后在脚本中,我想在 .我该怎么做?'c'=>3'z'

是的,顺序很重要。当我通过数组运行foreach()时,我不希望将此新添加的值添加到数组的末尾。我从mysql_fetch_assoc()获取此数组

我上面使用的键是占位符。使用 ksort() 不会实现我想要的。

http://www.php.net/manual/en/function.array-splice.php#88896 完成了我正在寻找的东西,但我正在寻找更简单的东西。

以包含大约 30 列的示例 db 表为例。我使用mysql_fetch_assoc()获取此数据。在这个新数组中,在“pizza”和“drink”列之后,我想添加一个新列“full_dinner”,该列结合了“pizza”和“drink”的值,以便当我在所述数组上运行foreach()时,“full_dinner”直接出现在“drink”之后


答案 1

我错过了什么吗?

$key = 'z';
$offset = array_search($key, array_keys($array));

$result = array_merge
        (
            array_slice($array, 0, $offset),
            array('c' => 3),
            array_slice($array, $offset, null)
        );

处理不存在的键(默认追加):$data

function insertBeforeKey($array, $key, $data = null)
{
    if (($offset = array_search($key, array_keys($array))) === false) // if the key doesn't exist
    {
        $offset = 0; // should we prepend $array with $data?
        $offset = count($array); // or should we append $array with $data? lets pick this one...
    }

    return array_merge(array_slice($array, 0, $offset), (array) $data, array_slice($array, $offset));
}

演示:

$array = array('a' => 1, 'z' => 2, 'd' => 4);

// array(4) { ["a"]=> int(1) ["c"]=> int(3) ["z"]=> int(2) ["d"]=> int(4) }
var_dump(insertBeforeKey($array, 'z', array('c' => 3)));

// array(4) { ["a"]=> int(1) ["z"]=> int(2) ["d"]=> int(4) ["c"]=> int(3) }
var_dump(insertBeforeKey($array, 'y', array('c' => 3)));

答案 2

一个简单的方法是循环访问原始数组,并随时构造一个新数组:

function InsertBeforeKey( $originalArray, $originalKey, $insertKey, $insertValue ) {

    $newArray = array();
    $inserted = false;

    foreach( $originalArray as $key => $value ) {

        if( !$inserted && $key === $originalKey ) {
            $newArray[ $insertKey ] = $insertValue;
            $inserted = true;
        }

        $newArray[ $key ] = $value;

    }

    return $newArray;

}

然后只需致电

$array = InsertBeforeKey( $array, 'd', 'c', 3 );