php 把数组赋给另一个数组,php将一个数组附加到另一个数组(不是array_push或+)
如何在不比較鍵的情況下將一個數組附加到另一個數組?
$a = array( 'a', 'b' );
$b = array( 'c', 'd' );
最后應該是:Array( [0]=>a [1]=>b [2]=>c [3]=>d )。如果我使用類似于[]或array_push的東西,它將導致以下結果之一:
Array( [0]=>a [1]=>b [2]=>Array( [0]=>c [1]=>d ) )
//or
Array( [0]=>c [1]=>d )
它應該是一些東西,這樣做,但以一種更優雅的方式:
foreach ( $b AS $var )
$a[] = $var;
array_merge ($a, $b)應該完全滿足您的需要,至少使用php 5+。
(相關)+PHP中數組的運算符
您發布的輸出都不是來自array_merge();,array_merge();的輸出應該是您所需要的:print_r(array_merge($a,$b)); // outputs => Array ( [0] => a [1] => b [2] => c [3] => d )。
我完全不同意"附加"這個詞。附加實際上意味著一個數組的項成為另一個(目標)數組的元素,該數組可能已經有一些元素,因此更改了目標數組。合并分配一個新數組并復制兩個數組的元素,而追加實際上意味著在不分配額外內存的情況下重用目標數組元素。
array_merge是一種優雅的方式:
$a = array('a', 'b');
$b = array('c', 'd');
$merge = array_merge($a, $b);
// $merge is now equals to array('a','b','c','d');
做一些類似的事情:
$merge = $a + $b;
// $merge now equals array('a','b')
不會工作,因為+運算符實際上沒有合并它們。如果他們的$a和$b擁有相同的密鑰,它就不會做任何事情。
注意,如果您的鍵不是數字而是字符串,則來自文檔:如果輸入數組具有相同的字符串鍵,則該鍵的后一個值將覆蓋前一個值。
或者使用modern splat operator作為@bstoney answer stackoverflow.com/a/37065301/962634
在php 5.6+中實現這一點的另一種方法是使用...令牌
$a = array('a', 'b');
$b = array('c', 'd');
array_push($a, ...$b);
// $a is now equals to array('a','b','c','d');
這也適用于任何Traversable。
$a = array('a', 'b');
$b = new ArrayIterator(array('c', 'd'));
array_push($a, ...$b);
// $a is now equals to array('a','b','c','d');
但是,如果數組$b為空,則會導致致命錯誤。
哪一個術語用于這種語法?(例如,在JS中,它被稱為Spread Operator)或者您可以提供到文檔的鏈接嗎?
@在PHP中,您會發現...通常被稱為splat operator。
為什么不使用
$appended = array_merge($a,$b);
為什么不使用這個,正確的,內置的方法呢?
OP在哪里說他"不想使用"array_merge()…?
@Kittencodings-閱讀問題的"編輯歷史記錄"…最初的問題是題為PHP append one array to another (not array_merge or array_push)…隨后修改為PHP append one array to another (not array_merge or +),然后改為當前標題
@馬克貝克哇!我不知道,所以有編輯歷史!很抱歉,謝謝,這改變了很多,并且有點阻止版主把話放進人們的口中,我以前覺得有些問題被破壞了,他們的評論被刪除/編輯的內容無效了,盡管我想大多數人可能不讀編輯歷史,但我相信從現在開始,Heck會這樣做的。
// Example 1 [Merging associative arrays. When two or more arrays have same key
// then the last array key value overrides the others one]
$array1 = array("a" =>"JAVA","b" =>"ASP");
$array2 = array("c" =>"C","b" =>"PHP");
echo" ?Example 1 Output:";
print_r(array_merge($array1,$array2));
// Example 2 [When you want to merge arrays having integer keys and
//want to reset integer keys to start from 0 then use array_merge() function]
$array3 =array(5 =>"CSS",6 =>"CSS3");
$array4 =array(8 =>"JAVASCRIPT",9 =>"HTML");
echo" ?Example 2 Output:";
print_r(array_merge($array3,$array4));
// Example 3 [When you want to merge arrays having integer keys and
// want to retain integer keys as it is then use PLUS (+) operator to merge arrays]
$array5 =array(5 =>"CSS",6 =>"CSS3");
$array6 =array(8 =>"JAVASCRIPT",9 =>"HTML");
echo" ?Example 3 Output:";
print_r($array5+$array6);
// Example 4 [When single array pass to array_merge having integer keys
// then the array return by array_merge have integer keys starting from 0]
$array7 =array(3 =>"CSS",4 =>"CSS3");
echo" ?Example 4 Output:";
print_r(array_merge($array7));
?>
輸出:
Example 1 Output:
Array
(
[a] => JAVA
[b] => PHP
[c] => C
)
Example 2 Output:
Array
(
[0] => CSS
[1] => CSS3
[2] => JAVASCRIPT
[3] => HTML
)
Example 3 Output:
Array
(
[5] => CSS
[6] => CSS3
[8] => JAVASCRIPT
[9] => HTML
)
Example 4 Output:
Array
(
[0] => CSS
[1] => CSS3
)
參考源代碼
這是一篇相當古老的文章,但我想添加一些關于將一個數組附加到另一個數組的內容:
如果
一個或兩個數組都有關聯鍵
兩個數組的鍵都不重要
您可以使用這樣的數組函數:
數組合并不會合并數字鍵,因此它會附加$AppendArray的所有值。當使用本機PHP函數而不是foreach循環時,在包含大量元素的數組上應該更快。
這樣做還有一個好處,就是不影響輸入數組。
是的,更安全的方法是提取數組的值,這樣就不會合并到同一個鍵中。
在Bstoney和Snark的回答之后,我對各種方法做了一些測試:
$array1 = array_fill(0,50000,'aa');
$array2 = array_fill(0,50000,'bb');
// Test 1 (array_merge)
$start = microtime(true);
$array1 = array_merge($array1, $array2);
echo sprintf("Test 1: %.06f
", microtime(true) - $start);
// Test2 (foreach)
$start = microtime(true);
foreach ($array2 as $v) {
$array1[] = $v;
}
echo sprintf("Test 2: %.06f
", microtime(true) - $start);
// Test 3 (... token)
// PHP 5.6+ and produces error if $array2 is empty
$start = microtime(true);
array_push($array1, ...$array2);
echo sprintf("Test 3: %.06f
", microtime(true) - $start);
產生:
Test 1: 0.008392
Test 2: 0.004626
Test 3: 0.003574
我相信從PHP7開始,方法3是一個更好的選擇,因為foreach循環現在的行為方式是復制一個被迭代的數組。
雖然方法3并不能嚴格地回答問題中"非數組推"的標準,但它是一條線,在所有方面都是最高性能的,我認為這個問題是在……語法是一種選擇。
對于大數組,最好在不合并數組的情況下進行連接,以避免內存復制。
$array1 = array_fill(0,50000,'aa');
$array2 = array_fill(0,100,'bb');
// Test 1 (array_merge)
$start = microtime(true);
$r1 = array_merge($array1, $array2);
echo sprintf("Test 1: %.06f
", microtime(true) - $start);
// Test2 (avoid copy)
$start = microtime(true);
foreach ($array2 as $v) {
$array1[] = $v;
}
echo sprintf("Test 2: %.06f
", microtime(true) - $start);
// Test 1: 0.004963
// Test 2: 0.000038
工作起來很有魅力,對我來說這個方法快了50倍。
foreach循環比數組合并更快地將值附加到現有數組,因此如果要將數組添加到另一個數組的末尾,請選擇循環。
// Create an array of arrays
$chars = [];
for ($i = 0; $i < 15000; $i++) {
$chars[] = array_fill(0, 10, 'a');
}
// test array_merge
$new = [];
$start = microtime(TRUE);
foreach ($chars as $splitArray) {
$new = array_merge($new, $splitArray);
}
echo microtime(true) - $start; // => 14.61776 sec
// test foreach
$new = [];
$start = microtime(TRUE);
foreach ($chars as $splitArray) {
foreach ($splitArray as $value) {
$new[] = $value;
}
}
echo microtime(true) - $start; // => 0.00900101 sec
// ==> 1600 times faster
此答案不會給頁面帶來任何新信息。幾年前公布了績效比較。
在PHP7之前,您可以使用:
array_splice()引用數組(第一個參數)進行操作,并將數組(第四個參數)值替換為從第二個參數和第三個參數的數目開始的值列表。當我們將第二個參數設置為源數組的結尾,將第三個參數設置為零時,我們將第四個參數值附加到第一個參數
你應該給那些不遵循非移除拼接魔法的人一些解釋。
如果要將空數組與現有的新值合并。必須先初始化它。
$products = array();
//just example
for($brand_id=1;$brand_id<=3;$brand_id++){
array_merge($products,getByBrand($brand_id));
}
// it will create empty array
print_r($a);
//check if array of products is empty
for($brand_id=1;$brand_id<=3;$brand_id++){
if(empty($products)){
$products = getByBrand($brand_id);
}else{
array_merge($products,getByBrand($brand_id));
}
}
// it will create array of products
希望有幫助。
這個怎么樣?
$appended = $a + $b;
如我所說,它將把鍵和以下結果進行比較:array([0]=>A[1]=>B)
你確定它會比較鑰匙嗎?說明文檔(emphasis mine):"如果輸入數組具有相同的字符串鍵,則該鍵的后一個值將覆蓋前一個值。但是,如果數組包含數字鍵,則后面的值不會覆蓋原始值,而是會被追加。"。你確定你的鑰匙實際上不是'0' => 'a'…而不是0 => 'a'?
我剛試過。
@piskvor鍵的"0"和"0"之間沒有區別。
戈登是對的。重點是數字鍵(而不是整數鍵)。
嗯,很有趣。這可能意味著文檔有誤。uk.php.net/manual/en/function.array-merge.php
@piskvor這是array_merge的文檔。+運算符不是array_merge的別名。在問題下方查看我的鏈接。
@戈登:啊,你說得對——這就是我同時想到兩件事的原因。php.net/manual/en/language.operators.array.php是用于array + array的文檔
總結
以上是生活随笔為你收集整理的php 把数组赋给另一个数组,php将一个数组附加到另一个数组(不是array_push或+)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php文件用什么浏览,什么是PHP文件
- 下一篇: php 5.3配置,php-5.3.3