PHP Conference Japan 2024

array_push

(PHP 4, PHP 5, PHP 7, PHP 8)

array_push将一个或多个元素压入数组的末尾

描述

array_push(数组 &$array, 混合 ...$values): int

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
)

参见

添加注释

用户贡献的注释 11 条注释

1243
Rodrigo de Aquino
12 年前
如果您要使用 array_push() 将 “$key” => “$value” 对插入到数组中,可以使用以下方法:

$data[$key] = $value;

无需使用 array_push。
bxi at apparoat dot nl
16 年前
我对 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[] 方法。

希望这对某些人有所帮助。
mrgreen dot webpost at gmail dot com
8 年前
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 ]
yhusky at qq dot com
6 年前
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
)
)
willdemaine at gmail dot com
16 年前
如果您在循环中向数组添加多个值,则使用 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
raat1979 at gmail dot com
8 年前
不幸的是,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
egingell at sisna dot com
18年前
如果你将一个数组压入堆栈,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
)
)
helpmepro1 at gmail dot com
15年前
优雅的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);

?>
gfuente at garrahan dot gov dot ar
7年前
如果要推入数组末尾的元素是一个数组,您将收到以下错误消息:

未知错误,值:[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 );

谢谢。
andrew at cgipro dot com
19年前
需要一个真正的单行代码来将元素添加到新的数组名称中?

$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:是的。我的单行代码创建一个新的数组作为先前数组的派生。
steve at webthoughts d\ot ca
19年前
对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] =>
)
To Top