PHP减去数组值
我有一个包含键和值的数组。每个值都是一个整数。我有一个具有相同键的其他数组。如何减去匹配键的所有值?另外,第二个数组中可能没有键,但两个数组的长度相同。如果数组2中有一个键在数组1中不存在,则其值应保持不变。如果第一个数组中有一个键不在第二个数组中,则应将其丢弃。我该怎么做?这有内置的功能吗 如果我要写一个脚本,它将是一种for循环,如下所示:PHP减去数组值,php,arrays,numbers,integer,subtraction,Php,Arrays,Numbers,Integer,Subtraction,我有一个包含键和值的数组。每个值都是一个整数。我有一个具有相同键的其他数组。如何减去匹配键的所有值?另外,第二个数组中可能没有键,但两个数组的长度相同。如果数组2中有一个键在数组1中不存在,则其值应保持不变。如果第一个数组中有一个键不在第二个数组中,则应将其丢弃。我该怎么做?这有内置的功能吗 如果我要写一个脚本,它将是一种for循环,如下所示: $arr1 = array('a' => 1, 'b' => 3, 'c' => 10); $arr2 = array('a' =&g
$arr1 = array('a' => 1, 'b' => 3, 'c' => 10);
$arr2 = array('a' => 2, 'b' => 1, 'c' => 5);
$ret = array();
foreach ($arr1 as $key => $value) {
$ret[$key] = $arr2[$key] - $arr1[$key];
}
print_r($ret);
/*
should be: array('a' => 1, 'b' => -2, 'c' => -5)
*/
我没有在这里添加一个键在一个数组中而不是在另一个数组中的情况。PHP不提供矢量化的数学运算。我将坚持您当前使用循环的方法
foreach ($arr2 as $key => $value) {
if(array_key_exists($key, $arr1) && array_key_exists($key, $arr2))
$ret[$key] = $arr2[$key] - $arr1[$key];
}
首先,我将获得每个数组的数组键集。(请参阅数组_键
功能)。然后,将它们相交。现在您将拥有每个数组的公用键。(查看数组_intersect
函数)。最后,迭代。这是一种易读且简单的方法
最后,您可以查看一个库,例如Math_Vector:如果您愿意,您可以避免使用数组函数 下面提供的闭包将从每个相应的
$arr2
中减去每个$arr1
值。不幸的是,array\u map
在使用多个输入数组时不会保留关键帧,因此我们使用将减去的结果合并回具有原始关键帧的数组:
$arr1 = array('a' => 1, 'b' => 3, 'c' => 10);
$arr2 = array('a' => 2, 'b' => 1, 'c' => 5);
$subtracted = array_map(function ($x, $y) { return $y-$x; } , $arr1, $arr2);
$result = array_combine(array_keys($arr1), $subtracted);
var_dump($result);
更新
我对数组函数如何与简单的foreach进行比较感兴趣,因此我使用Xdebug对两者进行了基准测试。以下是测试代码:
$arr1 = array('a' => 1, 'b' => 3, 'c' => 10);
$arr2 = array('a' => 2, 'b' => 1, 'c' => 5);
function arrayFunc($arr1, $arr2) {
$subtracted = array_map(function ($x, $y) { return $y-$x; } , $arr1, $arr2);
$result = array_combine(array_keys($arr1), $subtracted);
}
function foreachFunc($arr1, $arr2) {
$ret = array();
foreach ($arr1 as $key => $value) {
$ret[$key] = $arr2[$key] - $arr1[$key];
}
}
for ($i=0;$i<10000;$i++) { arrayFunc($arr1, $arr2); }
for ($i=0;$i<10000;$i++) { foreachFunc($arr1, $arr2); }
$arr1=array('a'=>1,'b'=>3,'c'=>10);
$arr2=数组('a'=>2,'b'=>1,'c'=>5);
函数arrayFunc($arr1,$arr2){
$subtracted=数组映射(函数($x,$y){return$y-$x;},$arr1,$arr2);
$result=array\u组合(array\u键($arr1),$subtracted);
}
函数foreachFunc($arr1,$arr2){
$ret=array();
foreach($arr1作为$key=>$value){
$ret[$key]=$arr2[$key]-$arr1[$key];
}
}
对于($i=0;$iYou走在正确的道路上……我认为只要稍加努力,您就可以实现您的目标。请注意,我在这个测试中使用了带有AMD64 2.2Ghz cpu的PHP5.4RC6。还有一件事:我运行了几次测试,并在每个后续迭代中收到类似的结果。此外,您还必须添加一些额外的代码来检查$arr中的键是否正确
和$arr2
匹配,如问题中所述-使用foreach
@Izkata更容易做到这一点-仅当按键的启动顺序不同时(它们在OP中)--关联数组在PHP中是有序的,因此您不必担心键会跳到您身上。我指的是还有一些键可能不会出现在第二个数组中,但两个数组的长度相同。
,因此,例如$arr2
有一个键d
,而不是c
。