PHP 中对数组的加减运算

发布于 2017-10-12 22:46:22 字数 3283 浏览 4852 评论 0

数组 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84960 人气
更多

推荐作者

遂心如意

文章 0 评论 0

5513090242

文章 0 评论 0

巷雨优美回忆

文章 0 评论 0

junpengz2000

文章 0 评论 0

13郎

文章 0 评论 0

qq_xU4RDg

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文