在PHP中将数组推入另一个数组 - 键问题

29
我试图将多个数组推入一个大数组中,从而形成一个二级数组。
我有以下一组示例数组:
Array ( [cod] => ddd [denum] => ffffffffffffffff [descr] => ggggggg [cant] => 3 ) Array ( [cod] => fff [denum] => dfgdfgdfgdfgdfg [descr] => dfgdfgdfgdfgdfg [cant] => 33 )
但是,在使用数组推送后,我得到了以下数组:
Array ( [0] => Array ( [0] => ddd [1] => ffffffffffffffff [2] => ggggggg [3] => 3 )
[1] => Array ( [0] => fff [1] => dfgdfgdfgdfgdfg [2] => dfgdfgdfgdfgdfg [3] => 33 )
)
基本上这就是我想做的,但是,如果您注意到,在推送之后,键被忘记并转换为数字。
这就是我想要的样子:
Array ( [0] => Array ( [cod] => ddd [denum] => ffffffffffffffff [descr] => ggggggg [cant] => 3 )
[1] => Array ( [cod] => fff [denum] => dfgdfgdfgdfgdfg [descr] => dfgdfgdfgdfgdfg [cant] => 33 )
)
我正在使用的示例代码:
$res_arr_values = array();
while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
   {
       array_push($res_arr_values, array_values($row));
   }

有人能帮我吗?


现在不应该再使用mysql_函数了。请参见使用mysqli结果获取行数组 - mickmackusa
6个回答

51

不要在你的$row上使用array_values

$res_arr_values = array();
while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
   {
       array_push($res_arr_values, $row);
   }

此外,向数组中添加值的首选方法是写成$array[] = $value;的形式,而不是使用array_push

$res_arr_values = array();
while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
   {
       $res_arr_values[] = $row;
   }

而且进一步的优化是不要调用mysql_fetch_array($result, MYSQL_ASSOC),而是直接使用mysql_fetch_assoc($result)

$res_arr_values = array();
while ($row = mysql_fetch_assoc($result))
   {
       $res_arr_values[] = $row;
   }

2
向数组添加值的首选方法是编写 $array[] = $value;。这很深刻,感谢提醒自己这一点有助于保持程序简单。 - pal4life

8

我认为你必须去做

$arrayname[indexname] = $value;

7

所有这些答案都很好,但是当我们考虑它时......
有时候最简单的方法并不需要复杂的技巧,可以更快地完成任务,而且不需要特殊的功能。

We first set the arrays:

$arr1 = Array(
"cod" => ddd,
"denum" => ffffffffffffffff,
"descr" => ggggggg,
"cant" => 3
);
$arr2 = Array
(
"cod" => fff,
"denum" => dfgdfgdfgdfgdfg,
"descr" => dfgdfgdfgdfgdfg,
"cant" => 33
);

Then we add them to the new array :

$newArr[] = $arr1;
$newArr[] = $arr2;

Now lets see our new array with all the keys:

print_r($newArr);

There's no need for sql or special functions to build a new multi-dimensional array.... don't use a tank to get to where you can walk.


1
感谢您为其他读者提供简单的答案。(请注意,这与接受的答案显示的技术相同。它在那里看起来更复杂,因为它是在问题的上下文中回答的。接受的答案中的关键行是:“$res_arr_values [] = $row;”,与此答案的“$newArr [] = $arr1;”相同) - ToolmakerSteve
确实。我完全同意每一个字。 :) - Shlomtzion

1

使用这个...

$res_arr_values = array();
while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
    $res_arr_values[] = $row;
}

array_push 和这个语法是相同的。 - Shiplu Mokaddim
array_push() 保留键,而 array_values() 则不会。 - Leigh
我没有使用array_push。我已经从答案中删除了array_values。 - Adrian Gunawan
问题不在于你的例子,而在于你的解释。它是错误的。在回答之前先做好研究。 - Basti

-1

首先将您的数组转换为JSON格式

while($query->fetch()){
   $col[] = json_encode($row,JSON_UNESCAPED_UNICODE);
}

然后将其转换回数组

foreach($col as &$array){
   $array = json_decode($array,true);
}

祝你好运


转换为JSON有什么好处吗?回答:没有。抱歉,这个答案对这个问答没有帮助。 - ToolmakerSteve

-2
$res_arr_values = array();
while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
    $res_arr_values[] = $row;
}


array_push == $res_arr_values[] = $row;

example 

<?php
$stack = array("orange", "banana");
array_push($stack, "apple", "raspberry");
print_r($stack);

Array
(
    [0] => orange
    [1] => banana
    [2] => apple
    [3] => raspberry
)
?>

7
你是否考虑添加一些叙述来解释这段代码为什么有效,以及它是如何回答问题的?这对于提问者和其他人都非常有帮助。 - Andrew Barber
@user1248047不想学习array_push函数,他/她只是想知道如何防止替换键值。 - SagarPPanchal
在此之前的一年中,已经有多个答案展示了这种技术。我认为这个答案并没有增加任何价值。如果我错了,请解释一下这个答案的新内容是什么。 - ToolmakerSteve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接