PHP 中对数组的加减运算
数组 Array 是一个很好用的数据格式,在 PHP 中我们可以很方便的操作他们,PHP 也对数组提供了很多可用的函数,甚至我们可以直接使用四则运算里面加减来对数组操作,本文就来分下数组运算中你不知道的坑。
array_merge
array_merge 可以合并两个甚至多个数组,该函数返回一个新的数组:
- 如果两个或更多个数组元素有相同的键名,则最后的元素会覆盖其他元素。
- 如果您仅向
array_merge()
函数输入一个数组,且键名是整数,则该函数将返回带有整数键名的新数组,其键名以 0 开始进行重新索引。
该函数与
array_merge_recursive()
函数之间的不同是在处理两个或更多个数组元素有相同的键名的情况。array_merge_recursive()
不会进行键名覆盖,而是将多个相同键名的值递归组成一个数组。
$arr1 = array('a'=>'PHP');
$arr2 = array('a'=>'JAVA');
//如果键名为字符,且键名相同,array_merge()后面数组元素值会覆盖前面数组元素值
print_r(array_merge($arr1,$arr2)); //Array ( [a] => JAVA )
$a1 = array("a"=>"red", "b"=>"green");
$a2 = array("c"=>"blue", "b"=>"yellow");
print_r(array_merge($a1, $a2));
//Array ( [a] => red => yellow [c] => blue )
$arr1 = array("C","PHP");
$arr2 = array("JAVA","PHP");
//如果键名为数字,array_merge()不会进行覆盖
print_r(array_merge($arr1,$arr2));
//Array ( [0] => C [1] => PHP [2] => JAVA [3] => PHP )
数组相加
PHP 中两个数组相加,如果有相同的键名,那么后面一个元素不会覆盖前一个元素。
$te = array("a")+array("b")
print_r($te);
//Array ( [0] => a )
因为,它们等效于 array("0″=>"a")+array("0″=>"b")
,它们的键名相同,前者不能被后者覆盖,如果是 array("0″=>"a")+array("0″=>"b","1″=>"c")
,那么结果等于 array("0″=>"a","1″=>"c")
。
数组相减
对不起,没有这样的操作,比如你想像下面这样的写代码:
$a = array(12, 15, "1"=>16);
$b = array(16);
print_r($a-$b);
会直接报错,出现不支持的操作类型。
Fatal error: Unsupported operand types in F:\wenjiangs\a.php on line 4
那如果我实在是想要数组相减,可以试试下面的函数,本代码传入两个数组 A 和 B,返回 A-B 的结果,即挑选出存在于 A,但不存在于 B 的元素
function RestaDeArrays($vectorA,$vectorB){
$cantA=count($vectorA);
$cantB=count($vectorB);
$No_saca=0;
for($i=0;$i<$cantA;$i++){
for($j=0;$j<$cantB;$j++){
if($vectorA[$i]==$vectorB[$j])
$No_saca=1;
}
if($No_saca==0)
$nuevo_array[]=$vectorA[$i];
else
$No_saca=0;
}
return $nuevo_array;
}
还有一种情况,我不是针对数组元素的键加减,而是对元素的加减,那你可以试试下面的方法,当然我能想到的就是遍历数组:
$ar1 = array(1,2,6);
$ar2 = array(4,7,5);
$result = array();
if (count($ar1) == count($ar2)) {
for($i = 0; $i < count($ar1); $i ++)
$result[] = $ar1[$i] - $ar2[$i];
}
print_r($result);
如果我们定义数组的时候,使用了相同的键名,那么会出现什么样的结果:
$switching = array(
10, // key = 0
5 => 6,
3 => 7,
'a' => 4,
11, // key = 6 (maximum of integer-indices was 5)
'8' => 2, // key = 8 (integer!)
'02' => 77, // key = '02'
0 => 12 // the value 10 will be overwritten by 12
);
同一个数组里面如果有相同的键名,则前面一个键名的值将会被覆盖(overwritten)。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论