如果您要使用 array_push() 将 “$key” => “$value” 对插入到数组中,可以使用以下方法:
$data[$key] = $value;
无需使用 array_push。
(PHP 4, PHP 5, PHP 7, PHP 8)
array_push — 将一个或多个元素压入数组的末尾
array_push() 将 array
视为一个栈,并将传递的变量压入 array
的末尾。 array
的长度将增加所压入变量的数量。其效果与
<?php
$array[] = $var;
?>
注意: 如果您使用 array_push() 向数组添加一个元素,最好使用
$array[] =
,因为这样可以避免调用函数的开销。
注意: 如果第一个参数不是数组,array_push() 将发出警告。这与在 PHP 7.1.0 之前
$var[]
的行为不同,后者会创建一个新数组。
array
输入数组。
values
要压入 array
末尾的值。
返回数组中新的元素数量。
版本 | 描述 |
---|---|
7.3.0 | 此函数现在可以只用一个参数调用。以前至少需要两个参数。 |
示例 #1 array_push() 示例
<?php
$stack = array("orange", "banana");
array_push($stack, "apple", "raspberry");
print_r($stack);
?>
以上示例将输出
Array ( [0] => orange [1] => banana [2] => apple [3] => raspberry )
如果您要使用 array_push() 将 “$key” => “$value” 对插入到数组中,可以使用以下方法:
$data[$key] = $value;
无需使用 array_push。
我对 array_push() 和 $array[] 方法进行了简单的比较,$array[] 方法似乎快得多。
<?php
$array = array();
for ($x = 1; $x <= 100000; $x++)
{
$array[] = $x;
}
?>
耗时 0.0622200965881 秒
以及
<?php
$array = array();
for ($x = 1; $x <= 100000; $x++)
{
array_push($array, $x);
}
?>
耗时 1.63195490837 秒
因此,如果您不使用 array_push() 的返回值,最好使用 $array[] 方法。
希望这对某些人有所帮助。
Rodrigo de Aquino 断言,与其使用 array_push 将追加到关联数组,不如直接执行……
$data[$key] = $value;
……但这实际上是不正确的。与 array_push 甚至……
$data[] = $value;
……Rodrigo 的建议并不能保证将新元素追加到数组的末尾。例如……
$data['one'] = 1;
$data['two'] = 2;
$data['three'] = 3;
$data['four'] = 4;
……很可能会导致一个看起来像这样的数组……
[ "four" => 4, "one" => 1, "three" => 3, "two" => 2 ]
我只能假设 PHP 在向数组添加元素时会对数组进行排序,以便以后更容易通过键找到指定的元素。在许多情况下,如果数组内部的存储顺序与您添加元素的顺序不同,这并不重要,但是,如果您稍后对数组执行 foreach 操作,则元素的处理顺序可能不是您需要的顺序。
如果您想将元素添加到关联数组的末尾,则应改用一元数组联合运算符(+=)……
$data['one'] = 1;
$data += [ "two" => 2 ];
$data += [ "three" => 3 ];
$data += [ "four" => 4 ];
当然,您也可以一次追加多个元素……
$data['one'] = 1;
$data += [ "two" => 2, "three" => 3 ];
$data += [ "four" => 4 ];
请注意,与 array_push(但与 $array[] = 不同)一样,数组必须在使用一元联合运算符之前存在,这意味着如果您在循环中构建数组,则需要先声明一个空数组……
$data = [];
for ( $i = 1; $i < 5; $i++ ) {
$data += [ "element$i" => $i ];
}
……这将导致一个看起来像这样的数组……
[ "element1" => 1, "element2" => 2, "element3" => 3, "element4" => 4 ]
12 年前 egingell at sisna dot com 的注释中存在错误。二维数组将输出“d,e,f”,而不是“a,b,c”。
<?php
$stack = array('a', 'b', 'c');
array_push($stack, array('d', 'e', 'f'));
print_r($stack);
?>
以上将输出:
Array (
[0] => a
[1] => b
[2] => c
[3] => Array (
[0] => d
[1] => e
[2] => f
)
)
如果您在循环中向数组添加多个值,则使用 array_push 比我一直看到的重复的 [] = 语句更快。
<?php
class timer
{
private $start;
private $end;
public function timer()
{
$this->start = microtime(true);
}
public function Finish()
{
$this->end = microtime(true);
}
private function GetStart()
{
if (isset($this->start))
return $this->start;
else
return false;
}
private function GetEnd()
{
if (isset($this->end))
return $this->end;
else
return false;
}
public function GetDiff()
{
return $this->GetEnd() - $this->GetStart();
}
public function Reset()
{
$this->start = microtime(true);
}
}
echo "使用 [] 向数组添加 100k 个元素\n\n";
$ta = array();
$test = new Timer();
for ($i = 0; $i < 100000; $i++)
{
$ta[] = $i;
}
$test->Finish();
echo $test->GetDiff();
echo "\n\n使用 array_push 向数组添加 100k 个元素\n\n";
$test->Reset();
for ($i = 0; $i < 100000; $i++)
{
array_push($ta,$i);
}
$test->Finish();
echo $test->GetDiff();
echo "\n\n每次迭代添加 10 个元素,使用 [] 向数组添加 100k 个元素\n\n";
$test->Reset();
for ($i = 0; $i < 10000; $i++)
{
$ta[] = $i;
$ta[] = $i;
$ta[] = $i;
$ta[] = $i;
$ta[] = $i;
$ta[] = $i;
$ta[] = $i;
$ta[] = $i;
$ta[] = $i;
$ta[] = $i;
}
$test->Finish();
echo $test->GetDiff();
echo "\n\n每次迭代添加 10 个元素,使用 array_push 向数组添加 100k 个元素\n\n";
$test->Reset();
for ($i = 0; $i < 10000; $i++)
{
array_push($ta,$i,$i,$i,$i,$i,$i,$i,$i,$i,$i);
}
$test->Finish();
echo $test->GetDiff();
?>
输出
$ php5 arraypush.php
X-Powered-By: PHP/5.2.5
Content-type: text/html
使用 [] 向数组添加 100k 个元素
0.044686794281006
使用 array_push 向数组添加 100k 个元素
0.072616100311279
每次迭代添加 10 个元素,使用 [] 向数组添加 100k 个元素
0.034690141677856
每次迭代添加 10 个元素,使用 array_push 向数组添加 100k 个元素
0.023932933807373
不幸的是,array_push 返回数组中新元素的数量
它不会返回你刚刚添加的元素的键,在数字数组中你可以使用 -1,但是你需要确保不存在关联键,否则这个假设就会失效。
如果 array_push 能像下面的函数一样返回刚刚添加的元素的键,那就更好了
(也许一个原生版本是个好主意……)
<?php
if(!function_exists('array_add')){
function array_add(array &$array,$value /*[, $...]*/){
$values = func_get_args(); //获取所有值
$values[0]= &$array; //引用!
$org=key($array); //我们在哪里?
call_user_func_array('array_push',$values);
end($array); //移动到最后一项
$key = key($array); //获取最后一项的键
if($org===null){
//在文件末尾,添加了一些东西,移动到它
return $key;
}elseif($org<(count($array)/2)){ //在中间某处 +/- 没问题
reset($array);
while (key($array) !== $org) next($List);
}else{
while (key($array) !== $org) prev($List);
}
return $key;
}
}
echo "<pre>\n";
$pr = array('foo'=>'bar','bar'=>'foo');
echo "原始数组:";
print_r($pr);
echo "\npush 1 返回 ".array_push($pr,1)."\n";
echo "------------------------------------\n";
$pr = array('foo'=>'bar','bar'=>'foo');
echo "\npush 2 返回 ".array_push($pr,1,2)."\n";
echo "------------------------------------\n";
$pr = array('foo'=>'bar','bar'=>'foo');
echo "\n add 1 返回 ".array_add($pr,2)."\n\n";
echo "------------------------------------\n";
$pr = array('foo'=>'bar','bar'=>'foo');
echo "\n add 2 返回 ".array_add($pr,1,2)."\n\n";
echo "<pre/>\n\n";
?>
输出结果
原始数组:数组
(
[foo] => bar
[bar] => foo
)
push 1 返回 3
------------------------------------
push 2 返回 4
------------------------------------
add 1 返回 0
------------------------------------
add 2 返回 1
如果你将一个数组压入堆栈,PHP 将把整个数组添加到下一个元素,而不是将键和值添加到数组中。如果这不是你想要的结果,最好使用 array_merge() 或遍历你正在压入的数组,并使用 `$stack[$key] = $value;` 添加每个元素。
<?php
$stack = array('a', 'b', 'c');
array_push($stack, array('d', 'e', 'f'));
print_r($stack);
?>
以上代码将输出以下内容
Array (
[0] => a
[1] => b
[2] => c
[3] => Array (
[0] => a
[1] => b
[2] => c
)
)
优雅的PHP数组组合算法
<?
//作者:Shimon Dookin
function get_combinations(&$lists,&$result,$stack=array(),$pos=0)
{
$list=$lists[$pos];
if(is_array($list))
foreach($list as $word)
{
array_push($stack,$word);
if(count($lists)==count($stack))
$result[]=$stack;
else
get_combinations($lists,$result,$stack,$pos+1);
array_pop($stack);
}
}
$wordlists= array( array("shimon","doodkin") , array("php programmer","sql programmer","mql metatrader programmer") );
get_combinations($wordlists,$combinations);
echo '<xmp>';
print_r($combinations);
?>
如果要推入数组末尾的元素是一个数组,您将收到以下错误消息:
未知错误,值:[8] 数组到字符串的转换
我尝试了以下两种方法:(都能工作,但会显示警告消息)
$aRol = array( $row[0], $row[1], $row[2] );
$aRoles[] = $aRol;
以及
array_push( $aRoles, $aRol);
正确的方法
$cUnRol = implode("(",array( $row[0], $row[1], $row[2] ) );
array_push( $aRoles, $cUnRol );
谢谢。
需要一个真正的单行代码来将元素添加到新的数组名称中?
$emp_list_bic = $emp_list + array(c=>"ANY CLIENT");
上下文…
drewdeal:事实证明,这比array_push()更好更简单。
patelbhadresh:太棒了!…所以你发现了新的方法…
drewdeal:因为你不能这样做:$emp_list_bic = array_push($emp_list, c=>"ANY CLIENT");
drewdeal:array_push返回一个计数并影响当前数组…并且不支持设置键!
drewdeal:是的。我的单行代码创建一个新的数组作为先前数组的派生。
对array_push_associative函数的进一步修改
1. 删除了看似无用的array_unshift函数,该函数会生成PHP警告
2. 添加了对非数组参数的支持
<?
// 追加关联数组元素
function array_push_associative(&$arr) {
$args = func_get_args();
foreach ($args as $arg) {
if (is_array($arg)) {
foreach ($arg as $key => $value) {
$arr[$key] = $value;
$ret++;
}
}else{
$arr[$arg] = "";
}
}
return $ret;
}
$items = array("here" => "now");
$moreitems = array("this" => "that");
$theArray = array("where" => "do we go", "here" => "we are today");
echo array_push_associative($theArray, $items, $moreitems, "five") . ' is the size of $theArray.<br />';
echo "<pre>";
print_r($theArray);
echo "</pre>";
?>
输出结果
4 is the size of $theArray.
数组
(
[where] => do we go
[here] => now
[this] => that
[five] =>
)