如果您要使用 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 ]
不幸的是,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 "Taken array;";
print_r($pr);
echo "\npush 1 returns ".array_push($pr,1)."\n";
echo "------------------------------------\n";
$pr = array('foo'=>'bar','bar'=>'foo');
echo "\npush 2 returns ".array_push($pr,1,2)."\n";
echo "------------------------------------\n";
$pr = array('foo'=>'bar','bar'=>'foo');
echo "\n add 1 returns ".array_add($pr,2)."\n\n";
echo "------------------------------------\n";
$pr = array('foo'=>'bar','bar'=>'foo');
echo "\n add 2 returns ".array_add($pr,1,2)."\n\n";
echo "<pre/>\n\n";
?>
输出
Taken array;Array
(
[foo] => bar
[bar] => foo
)
push 1 returns 3
------------------------------------
push 2 returns 4
------------------------------------
add 1 returns 0
------------------------------------
add 2 returns 1
如果您在一个循环中向数组添加多个值,使用 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向数组添加 100k 个元素,使用 array_push\n\n";
$test->Reset();
for ($i = 0; $i < 100000; $i++)
{
array_push($ta,$i);
}
$test->Finish();
echo $test->GetDiff();
echo "\n\n向数组添加 100k 个元素,使用 [],每次 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向数组添加 100k 个元素,使用 array_push,每次 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
向数组添加 100k 个元素,使用 []
0.044686794281006
向数组添加 100k 个元素,使用 array_push
0.072616100311279
向数组添加 100k 个元素,使用 [],每次 10 个
0.034690141677856
向数组添加 100k 个元素,使用 array_push,每次 10 个
0.023932933807373
egingell at 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
)
)
如果你将一个数组推入栈中,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 5.4 中引入了推入数组引用的问题 - 是不是有人决定它不再需要了?
在 PHP 5.3 中,可以使用以下代码:
$A=array(); array_push($A,1); $c=2; array_push($A,&$c); print_r($A); $c=3; print_r($A);
正确输出:
Array ( [0] => 1 [1] => 2 )
Array ( [0] => 1 [1] => 3 )
将引用视为其他语言中的指针...
例如,此函数可用于推入 MySQL 查询的参数
$params=array(); array_push($params,&$field1); array_push($params,&$field2); array_unshift($params,'ss');
call_user_func_array(array($Query,'bind_param'),$params);
这段代码在 PHP 5.4 中会导致致命错误,并且根据服务器配置,它甚至可能不会报告错误原因...
解决此问题的变通方案是:
$A=array(); $A[]=1; $c=2; $A[]=&$c; print_r($A); $c=3; print_r($A);
$params=array(); $params[]=&$field1; $params[]=&$field2; array_unshift($params,'ss');
call_user_func_array(array($Query,'bind_param'),$params);
(在实际代码中,字段是动态指定的,并在 for 循环中进行迭代...)
这在 PHP 5.3 和 PHP 5.6 中都似乎有效...
这是我将一个数组的所有元素添加到另一个数组的方法
<?php
$oneArray = ['d', 'e', 'f'];
$anotherArray = ['a', 'b', 'c'];
array_push($anotherArray, ...$oneArray);
//['a', 'b', 'c', 'd', 'e', 'f'];
如果你想保留数组中的键,可以使用以下代码:
<?php
function array_pshift(&$array) {
$keys = array_keys($array);
$key = array_shift($keys);
$element = $array[$key];
unset($array[$key]);
return $element;
}
?>
优雅的 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);
?>
Skylifter 在 2004 年 1 月 20 日的笔记中指出,[] 空括号符号不会像 array_push 那样返回数组计数。array_push 和推荐的空括号符号之间还存在另一个区别。
空括号不会像 array_push 那样首先检查变量是否为数组。如果 array_push 发现一个变量不是数组,它会在 E_ALL 错误报告开启的情况下打印一条警告消息。
因此,在 PHP 开发人员更改此行为之前,array_push 比 [] 更安全。
在开发 PocketMine 插件时,将内容添加到 YAML 表中的一种好方法是:
$table=$this->config->get("Table");
array_push($table, "New Value for table");
$this->config->set("Table", $table);
需要一个真正的一行代码来将一个元素添加到一个新的数组名称中?
$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.
Array
(
[where] => do we go
[here] => now
[this] => that
[five] =>
)
如果要推入数组末尾的元素是数组,则会收到以下错误消息:
Unknown Error, value: [8] Array to string conversion
我尝试了以下两种方法(都可以,但会显示警告消息):
$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 );
谢谢。
使用 $array "+=" array(1,2,3) 或联合运算符 (https://php.net/manual/en/language.operators.array.php) 时要小心
我认为它在过去有效,或者我测试得不够充分。:-/
(曾经有效,曾经 [] 比 array_push 快,过去 :-D )
php -r '$a = array(1,2); $a += array(3,4); print_r($a);'
Array (
[0] => 1
[1] => 2
)
php -r '$a = array(1,2); $b = array(3,4);$c = $a + $b; print_r($c);'
Array (
[0] => 1
[1] => 2
)
php -r '$a = array(1,2); $b = array(2=>3,3=>4);$c = $a + $b; print_r($c);'
Array (
[0] => 1
[1] => 2
[2] => 3
[3] => 4
)
使用 array_push 后,你可能希望在使用 array_pop 之前读取一次或多次顶层(最后一个)数组元素。为了高效地读取顶层数组元素,请使用 "current" 函数。
如果你需要将一个多维数字数组推入另一个数组,array_push 会将整个数组推入第一个数组的一个键中。例如,假设你有两个数组
<?php
$array1 = [
0 => [
"key1" => "value1",
"key2" => "value2"
]
];
$array2 = [
0 => [
"key1" => "value1",
"key2" => "value2"
]
];
$array1[] = $array2;
// 之后,array1 将会变成这样:
[
0 => [
"key1" => "value1",
"key2" => "value2"
],
1 => [
0 => [
"key1" => "value2",
"key2" => "value2"
]
]
// 如果你不希望发生这种情况,这里有一个函数可以避免这种情况:
function array_push_indexes($array1, $array2){
$lastKey = array_key_last($array1);
for($i = 0; $i < count($array2); $i++){
$KeyPosition = 1 + $i;
$array1[$lastKey+$KeyPosition] = $array2[$i];
}
return $array1;
}
// 使用之前相同的例子,这个函数将返回:
[
0 => [
"key1" => "value1",
"key2" => "value2"
],
1 => [
"key1" => "value1",
"key2" => "value2"
]
]
?>
P.S: `array_key_last` 函数适用于 PHP >= 7.3.0,更多信息请查看这里:https://php.net/manual/en/function.array-key-last.php
此函数模仿 Perl 中的 `push()` 函数,Perl 允许将一个数组推入另一个数组:`push(@array, @array2, @array3)`。此函数模拟了这种行为。
<?php
function array_push_array(&$arr) {
$args = func_get_args();
array_shift($args);
if (!is_array($arr)) {
trigger_error(sprintf("%s: Cannot perform push on something that isn't an array!", __FUNCTION__), E_USER_WARNING);
return false;
}
foreach($args as $v) {
if (is_array($v)) {
if (count($v) > 0) {
array_unshift($v, &$arr);
call_user_func_array('array_push', $v);
}
} else {
$arr[] = $v;
}
}
return count($arr);
}
$arr = array(0);
$arr2 = array(6,7,8);
printf("%s\n", array_push_array($arr, array(),array(1,2,3,4,5), $arr2));
print_r($arr);
# 错误..
$arr = "test";
printf("%s\n", array_push_array($arr, array(),array(1,2,3,4,5), $arr2));
?>
在数组中的特定索引或键之前或之后添加元素
<?php
/**
* @return array
* @param array $src
* @param array $in
* @param int|string $pos
*/
function array_push_before($src,$in,$pos){
if(is_int($pos)) $R=array_merge(array_slice($src,0,$pos), $in, array_slice($src,$pos));
else{
foreach($src as $k=>$v){
if($k==$pos)$R=array_merge($R,$in);
$R[$k]=$v;
}
}return $R;
}
/**
* @return array
* @param array $src
* @param array $in
* @param int|string $pos
*/
function array_push_after($src,$in,$pos){
if(is_int($pos)) $R=array_merge(array_slice($src,0,$pos+1), $in, array_slice($src,$pos+1));
else{
foreach($src as $k=>$v){
$R[$k]=$v;
if($k==$pos)$R=array_merge($R,$in);
}
}return $R;
}
// 例子:
$src=array("A","B","C");
$in=array("X","Y");
var_dump(array_push_before($src,$in,1));
/* array_push_before,无键数组
array(5) {
[0]=>
string(1) "A"
[1]=>
string(1) "X"
[2]=>
string(1) "Y"
[3]=>
string(1) "B"
[4]=>
string(1) "C"
}*/
var_dump(array_push_after($src,$in,1));
/* array_push_after,无键数组
array(5) {
[0]=>
string(1) "A"
[1]=>
string(1) "B"
[2]=>
string(1) "X"
[3]=>
string(1) "Y"
[4]=>
string(1) "C"
}*/
$src=array('a'=>"A",'b'=>"B",'c'=>"C");
$in=array('x'=>"X",'y'=>"Y");
var_dump(array_push_before($src,$in,1));
/* array_push_before,有键数组,在索引之前插入
array(5) {
["a"]=>
string(1) "A"
["x"]=>
string(1) "X"
["y"]=>
string(1) "Y"
["b"]=>
string(1) "B"
["c"]=>
string(1) "C"
}*/
var_dump(array_push_before($src,$in,'b'));
/* array_push_before,有键数组,在键之前插入
array(5) {
["a"]=>
string(1) "A"
["x"]=>
string(1) "X"
["y"]=>
string(1) "Y"
["b"]=>
string(1) "B"
["c"]=>
string(1) "C"
}*/
var_dump(array_push_after($src,$in,1));
/* array_push_after,有键数组,在索引之后插入
array(5) {
["a"]=>
string(1) "A"
["b"]=>
string(1) "B"
["x"]=>
string(1) "X"
["y"]=>
string(1) "Y"
["c"]=>
string(1) "C"
}*/
var_dump(array_push_after($src,$in,'b'));
/* array_push_after,有键数组,在键之后插入
array(5) {
["a"]=>
string(1) "A"
["b"]=>
string(1) "B"
["x"]=>
string(1) "X"
["y"]=>
string(1) "Y"
["c"]=>
string(1) "C"
}*/
?>
一个小型且基本的堆栈实现,不使用数组。
类节点
{
var $elem;
var $next;
}
类堆栈
{
var $next;
函数 pop()
{
$aux=$this->next->elem;
$this->next=$this->next->next;
return $aux;
}
函数 push($obj)
{
$nod=new node;
$nod->elem=$obj;
$nod->next=$this->next;
$this->next=$nod;
}
函数 stack()
{
$this->next=NULL;
}
}
我做了一个性能检查,发现如果推送多个值,它比正常的 $array[] 版本的数组推送更快。
案例 1:$array[] = something;
案例 2:array_push($array, $value);
案例 3:array_push($array, $value1, $value2, $value3 [...]); $values 已定义
案例 4:array_push($array, $value1, $value2, $value3 [...]); $values 已定义,当 $array 不为空时
案例 5:案例 1 + 案例 3
案例 6:结果数组包含一些值(案例 4)
案例 7:结果数组包含与推送数组相同的值(案例 4)
-----------------------------------------------------------------------------------------------------------
~~~~~~~~~~~~ 案例 1 ~~~~~~~~~~~~
时间:0.0310 0.0300 0.0290 0.0340 0.0400 0.0440 0.0480 0.0550 0.0570 0.0570
最小值:0.0290
最大值:0.0570
平均值:0.0425
~~~~~~~~~~~~ 案例 2 ~~~~~~~~~~~~
时间:0.3890 0.3850 0.3770 0.4110 0.4020 0.3980 0.4020 0.4060 0.4130 0.4200
最小值:0.3770
最大值:0.4200
平均值:0.4003
~~~~~~~~~~~~ 案例 3 ~~~~~~~~~~~~
时间:0.0200 0.0220 0.0240 0.0340 0.0360 0.0410 0.0460 0.0500 0.0520 0.0520
最小值:0.0200
最大值:0.0520
平均值:0.0377
~~~~~~~~~~~~ 案例 4 ~~~~~~~~~~~~
时间:0.0200 0.0250 0.0230 0.0260 0.0330 0.0390 0.0460 0.0510 0.0520 0.0520
最小值:0.0200
最大值:0.0520
平均值:0.0367
~~~~~~~~~~~~ 案例 5 ~~~~~~~~~~~~
时间:0.0260 0.0250 0.0370 0.0360 0.0390 0.0440 0.0510 0.0520 0.0530 0.0560
最小值:0.0250
最大值:0.0560
平均值:0.0419
~~~~~~~~~~~~ 案例 6 ~~~~~~~~~~~~
时间:0.0340 0.0280 0.0370 0.0410 0.0450 0.0480 0.0560 0.0580 0.0580 0.0570
最小值:0.0280
最大值:0.0580
平均值:0.0462
~~~~~~~~~~~~ 案例 7 ~~~~~~~~~~~~
时间:0.0290 0.0270 0.0350 0.0410 0.0430 0.0470 0.0540 0.0540 0.0550 0.0550
最小值:0.0270
最大值:0.0550
平均值:0.044
测试代码
// 案例 1
$startTime = microtime(true);
$array = array();
for ($x = 1; $x <= 100000; $x++)
{
$array[] = $x;
}
$endTime = microtime(true);
// 案例 2
$startTime = microtime(true);
$array = array();
for ($x = 1; $x <= 100000; $x++)
{
array_push($array, $x);
}
$endTime = microtime(true);
// 案例 3
$result = array();
$array2 = array(&$result)+$array;
$startTime = microtime(true);
call_user_func_array("array_push", $array2);
$endTime = microtime(true);
// 案例 4
$result = array();
for ($x = 1; $x <= 100000; $x++)
{
$result[] = $x;
}
$array2 = array(&$result)+$array;
$startTime = microtime(true);
call_user_func_array("array_push", $array2);
$endTime = microtime(true);
// 案例 5
$result = array();
$startTime = microtime(true);
$array = array(&$result);
for ($x = 1; $x <= 100000; $x++)
{
$array[] = $x;
}
$endTime = microtime(true);
// 案例 6
$result = array(1,2,3,4,5,6);
$startTime = microtime(true);
$array = array(&$result);
for ($x = 1; $x <= 100000; $x++)
{
$array[] = $x;
}
$endTime = microtime(true);
// 案例 7
$result = array();
for ($x = 1; $x <= 100000; $x++)
{
$result[] = $x;
}
$startTime = microtime(true);
$array = array(&$result);
for ($x = 1; $x <= 100000; $x++)
{
$array[] = $x;
}
$endTime = microtime(true);
要将值插入非关联数组,我发现这个简单的函数可以解决问题
函数 insert_in_array_pos($array, $pos, $value)
{
$result = array_merge(array_slice($array, 0 , $pos), array($value), array_slice($array, $pos));
return $result;
}
看起来比上面给出的迭代解决方案简单得多...
这将有助于解决关联数组问题
$aValues[$key] = $value;
其中 $key 是一个唯一的标识符,$value 是要存储的值。由于 $key 使用字符串或数字,如果您已经有一个 $key 与现有 $key 的值相同,该元素将被覆盖。
例如。
$aValues["one"] = "value of one";
$aValues["two"] = "different value of two!";
给出
array([one] => "value of one", [two] => "value of two");
但在使用相同的键 (one) 时将被覆盖
$aValues["one"] = "value of one";
$aValues["one"] = "different value of two!";
将给出
array([one] => "different value of two!");
3686
一个非常好的从数组中删除元素的函数
函数 array_del($str,&$array)
{
if (in_array($str,$array)==true)
{
foreach ($array as $key=>$value)
{
if ($value==$str) unset($array[$key]);
}
}
}
如果您想将元素放入数组的特定位置,请尝试使用此函数。
<?php
function array_put_to_position(&$array, $object, $position, $name = null)
{
$count = 0;
$return = array();
foreach ($array as $k => $v)
{
// 插入新对象
if ($count == $position)
{
if (!$name) $name = $count;
$return[$name] = $object;
$inserted = true;
}
// 插入旧对象
$return[$k] = $v;
$count++;
}
if (!$name) $name = $count;
if (!$inserted) $return[$name];
$array = $return;
return $array;
}
?>
示例
<?php
$a = array(
'a' => 'A',
'b' => 'B',
'c' => 'C',
);
print_r($a);
array_put_to_position($a, 'G', 2, 'g');
print_r($a);
/*
Array
(
[a] => A
[b] => B
[c] => C
)
Array
(
[a] => A
[b] => B
[g] => G
[c] => C
)
*/
?>
kamprettos 的关联数组推送的变体
// 附加关联数组元素
函数 associative_push($arr, $tmp) {
if (is_array($tmp)) {
foreach ($tmp as $key => $value) {
$arr[$key] = $value;
}
return $arr;
}
return false;
}
$theArray = array();
$theArray = associative_push($theArray, $items);
正如有人指出的那样,array_push() 函数返回数组的计数,而不是新元素的键。由于我需要的是后者函数,所以我写了这个非常简单的替换。
函数 array_push2(&$array,$object,$key=null){
$keys = array_keys($array);
rsort($keys);
$newkey = ($key==null)?$keys[0]+1:$key;
$array[$newkey] = $object;
return $newkey;
}
我发现了一种简单的方法来实现一个“array_push_array”函数,在我们需要使用 call_user_func_array() 时,没有引用问题,希望这有帮助
函数 array_push_array(array &$array)
{
$numArgs = func_num_args();
if(2 > $numArgs)
{
trigger_error(sprintf('%s: expects at least 2 parameters, %s given', __FUNCTION__, $numArgs), E_USER_WARNING);
return false;
}
$values = func_get_args();
array_shift($values);
foreach($values as $v)
{
if(is_array($v))
{
if(count($v) > 0)
{
foreach($v as $w)
{
$array[] = $w;
}
}
}
else
{
$array[] = $v;
}
}
return count($array);
}
寻找一种将数据推送到关联数组的方法,并感到沮丧地知道 array_push() 无法完成这项工作?
这是我的场景
-------------------
我需要将系统命令输出关联到像这样的关联数组中
[sge@digital_db work]$ /usr/local/apache/htdocs/work/qhost.sh -h t1 -F | awk '{if(NR>4) print $1}' | sed 's/hl://g'
arch=lx24-amd64
num_proc=2.000000
mem_total=3.808G
swap_total=3.907G
virtual_total=7.715G
load_avg=0.000000
load_short=0.000000
load_medium=0.000000
load_long=0.000000
mem_free=3.510G
swap_free=3.907G
virtual_free=7.417G
mem_used=305.242M
swap_used=0.000
virtual_used=305.242M
cpu=0.000000
np_load_avg=0.000000
np_load_short=0.000000
np_load_medium=0.000000
np_load_long=0.000000
我怎么做到的
<? php
# 进入系统命令输出
$assoc_cmd =`$work_dir/qhost.sh -h $host_resource -F | awk '{if(NR>4) print $1}'| sed 's/hl://g' ` ;
# 拆分 "\n" 字符
$assoc_row = explode("\n", chop($assoc_cmd));
# 获取索引行
$idx_row = count($assoc_row) - 1 ;
# 初始化关联数组
$host_res_array = array();
for ($i = 0 ; $i<= $idx_row ; $i++)
{
# 获取参数和值
list($host_param,$host_val) = explode("=",$assoc_row[$i]);
# 将数据填充/推送到关联数组
$host_res_array[$host_param]= $host_val ;
}
echo "<pre> 架构 : </pre>\n" ;
echo $host_res_array['arch'] ;
echo "<pre> 内存总量 : </pre>\n" ;
echo $host_res_array['mem_tot'];
?>
希望这有帮助!:)
此函数“返回数组中新元素的数量”。
要找出最后一个索引,请使用
<?php
$count = array_push($array, $value);
$last_index = array_pop(array_keys($array));
?>
将值推入堆栈时的常见操作是访问堆栈顶部的值。
这可以使用“end”函数轻松完成
<?php
$top=end($stack);
?>
注意:有关其对很少使用的内部数组指针的副作用的详细信息,请参阅“end”函数。
关于 O'Neill 将值插入非关联数组的解决方案的速度,我已经进行了一些测试,发现如果您有一个小的数组和更多的插入,它表现良好,但是对于一个巨大的数组和很少的插入,我建议使用以下函数
function array_insert( &$array, $index, $value ) {
$cnt = count($array);
for( $i = $cnt-1; $i >= $index; --$i ) {
$array[ $i + 1 ] = $array[ $i ];
}
$array[$index] = $value;
}
或者,如果您是一个速度上瘾的程序员(相同情况:大数组,很少的插入)使用这个
array_splice ( $array, $offset, 0, $item );
item 也可以是一个值数组;)。
只能通过引用传递变量
$arr = [1,2,3];
array_push(['a','b'],$arr) ; // 错误
array_push($arr,[1,2,3]) ; // 正确
Array_push 也适用于多维数组。只需确保元素首先被定义为一个数组。
<?php
$array["element"][$element]["element"] = array();
array_push ($array["element"][$element]["element"], "banana");
?>