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

Cit*_*zen 25 php arrays associative-array

让我们说我有这个数组:

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

在后来的剧本,我想添加值'c'=>3之前'z'.我怎样才能做到这一点?

编辑:是的,订单很重要.当我通过数组运行foreach()时,我不希望将新添加的值添加到数组的末尾.我从mysql_fetch_assoc()获取此数组

编辑2:我上面使用的键是占位符.使用kso​​rt()将无法达到我想要的效果.

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

编辑4:谢谢你的downvotes.我对你的答案给出了反馈,你无能为力,所以你贬低并要求关闭这个问题,因为你不知道答案.谢谢.

编辑5:获取一个包含约30列的示例数据库表.我使用mysql_fetch_assoc()获取此数据.在这个新数组中,在'pizza'和'drink'列之后,我想添加一个新列'full_dinner',它结合了'pizza'和'drink'的值,这样当我在所述数组上运行foreach()时,'full_dinner'直接来自'drink'

Ali*_*xel 34

我错过了什么吗?

$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)
        );
Run Code Online (Sandbox Code Playgroud)

处理不存在的键($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));
}
Run Code Online (Sandbox Code Playgroud)

演示:

$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)));
Run Code Online (Sandbox Code Playgroud)

  • @Tomas:类型转换是为了确保你仍然可以在`$ data`中使用标量值,如`3`而不是`array('c'=> 3)`. (2认同)

Ami*_*mer 14

一个简单的方法是迭代原始数组,构建一个新数组:

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;

}
Run Code Online (Sandbox Code Playgroud)

然后直接打电话

$array = InsertBeforeKey( $array, 'd', 'c', 3 );
Run Code Online (Sandbox Code Playgroud)

  • 这样做,但我发现很难相信一个更简单的方法不存在. (3认同)

nem*_*m75 10

根据您的原始问题,我能找到的最佳答案是:

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

$splitIndex = array_search('z', array_keys($a));
$b = array_merge(
        array_slice($a, 0, $splitIndex), 
        array('c' => 3), 
        array_slice($a, $splitIndex)
);

var_dump($b);
array(4) {
  ["a"]=>
  int(1)
  ["c"]=>
  int(3)
  ["z"]=>
  int(2)
  ["d"]=>
  int(4)
}
Run Code Online (Sandbox Code Playgroud)

根据您的阵列的大小,您将在内部存储器中复制相当多的数据,无论您使用此解决方案还是其他解决方案.

此外,您的第五个编辑似乎表明您的SQL查询可以改进.你似乎想做的事情是这样的:

SELECT a, b, CONCAT(a, ' ', b) AS ab FROM ... WHERE ...
Run Code Online (Sandbox Code Playgroud)

如果更改SELECT语句可能会使PHP解决方案变得多余,那么您肯定应该使用修改后的SQL.

  • 为了安全起见:`if($ splitIndex === false){$ a ['c'] = 3}`?如果找不到密钥,之前没有任何内容可以插入,所以只需按到数组末尾即可... (2认同)

Dan*_*oap 5

function insertValue($oldArray, $newKey, $newValue, $followingKey) {

    $newArray = array ();
    foreach (array_keys($oldArray) as $k) {
        if ($k == $followingKey)
            $newArray[$newKey] = $newValue;
        $newArray[$k] = $oldArray [$k];
    }

    return $newArray;
}
Run Code Online (Sandbox Code Playgroud)

你称之为

insertValue($array, 'c', '3', 'z')
Run Code Online (Sandbox Code Playgroud)

至于编辑5:

编辑你的sql,以便它读取

SELECT ..., pizza, drink, pizza+drink as full_meal, ... FROM ....
Run Code Online (Sandbox Code Playgroud)

并且您自动拥有该列:

Array (
  ...
  'pizza' => 12,
  'drink' => 5,
  'full_meal' => 17,
  ...
)
Run Code Online (Sandbox Code Playgroud)