PHP Conference Japan 2024

array_push

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

array_push將一個或多個元素推入陣列的末尾

描述

array_push(array &$array, mixed ...$values): int

array_push()array 視為堆疊,並將傳遞的變數推入 array 的末尾。 array 的長度會增加所推入的變數數量。效果等同於

<?php
$array
[] = $var;
?>
為每個傳遞的值重複執行。

注意 如果您使用 array_push() 向陣列新增一個元素,最好使用 $array[] = ,因為這樣做沒有呼叫函式的額外開銷。

注意 如果第一個參數不是陣列,array_push() 將會發出警告。這與 $var[] 的行為不同,在 PHP 7.1.0 之前,後者會建立一個新的陣列。

參數

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。
710
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[] 的方式。

希望這對某人有幫助。
135
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 ]
22
yhusky at qq dot com
6 年前
eginjell 在 sisna dot com 於 12 年前寫的筆記中犯了一個錯誤。二維陣列將輸出 "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
)
)
49
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
"使用 [] 向陣列添加 10 萬個元素\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 向陣列添加 10 萬個元素\n\n";
$test->Reset();
for (
$i = 0; $i < 100000; $i++)
{
array_push($ta,$i);
}
$test->Finish();
echo
$test->GetDiff();

echo
"\n\n每次迭代使用 [] 向陣列添加 10 個元素,總共 10 萬個元素\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每次迭代使用 array_push 向陣列添加 10 個元素,總共 10 萬個元素\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

使用 [] 向陣列添加 10 萬個元素

0.044686794281006

使用 array_push 向陣列添加 10 萬個元素

0.072616100311279

每次迭代使用 [] 向陣列添加 10 個元素,總共 10 萬個元素

0.034690141677856

每次迭代使用 array_push 向陣列添加 10 個元素,總共 10 萬個元素

0.023932933807373
6
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
"\n推入 1 回傳 ".array_push($pr,1)."\n";
echo
"------------------------------------\n";
$pr = array('foo'=>'bar','bar'=>'foo');
echo
"\n推入 2 回傳 ".array_push($pr,1,2)."\n";
echo
"------------------------------------\n";
$pr = array('foo'=>'bar','bar'=>'foo');
echo
"\n 加入 1 回傳 ".array_add($pr,2)."\n\n";
echo
"------------------------------------\n";
$pr = array('foo'=>'bar','bar'=>'foo');
echo
"\n 加入 2 回傳 ".array_add($pr,1,2)."\n\n";
echo
"<pre/>\n\n";
?>
輸出
使用的陣列;陣列
(
[foo] => bar
[bar] => foo
)

推入 1 回傳 3
------------------------------------

推入 2 回傳 4
------------------------------------

加入 1 回傳 0

------------------------------------

加入 2 回傳 1
53
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
)
)
6
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);

?>
1
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 );

感謝。
3
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:是的。我的單行程式碼會建立一個新的陣列,作為先前陣列的衍生
2
steve at webthoughts d\ot ca
19 年前
對 array_push_associative 函數的進一步修改
1. 移除產生 php 警告的看似無用的 array_unshift 函數
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") . ' 是 $theArray 的大小。<br />';

echo "<pre>";
print_r($theArray);
echo "</pre>";

?>

產生

4 是 $theArray 的大小。
陣列
(
[where] => do we go
[here] => now
[this] => that
[five] =>
)
To Top