如果您打算使用 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() 將會發出警告。這與
$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 )
如果您打算使用 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 ]
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
)
)
如果你在迴圈中向陣列添加多個值,使用 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
不幸的是,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
如果您將一個陣列推入堆疊,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. 移除產生 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] =>
)