将数组合并为一个,同时保留key =>值PHP的值

时间:2013-11-06 20:07:27

标签: php arrays

我最近问了一个问题,merging the values of arrays in an array of arrays in php并得到了正确的答案,它是如何出现问题的,无论我放置的var转储还是回声,都无法弄清楚。

使用相同的数组示例,以及我提供的解决方案:

$result = array();
if(is_array($ticketLabors) && !empty($ticketLabors)){
    foreach ($ticketLabors as $innerArray) {
        foreach ($innerArray as $key=>$value) {
            $result[$key] = number_format($result[$key] + $value, 2);
        }
    }
}
var_dump($result);

在像这样的数组上:

array(2) {
  [0]=>
  array(10) {
    ["ticket_labor_ot_travel_c"]=>
    string(5) "34.50"
    ["ticket_labor_travel_c"]=>
    string(5) "23.00"
    ["ticket_labor_ot_c"]=>
    string(5) "34.50"
    ["ticket_labor_reg_c"]=>
    string(5) "23.00"
    ["ticket_labor_user_id"]=>
    string(3) "319"
    ["ticket_labor_tot_hours"]=>
    string(4) "0.50"
    ["ticket_labor_reg_hours"]=>
    string(4) "0.50"
    ["ticket_labor_ot_hours"]=>
    string(4) "0.00"
    ["ticket_labor_travel_hours"]=>
    string(4) "0.00"
    ["ticket_labor_ot_travel_hours"]=>
    string(4) "0.00"
  }
  [1]=>
  array(10) {
    ["ticket_labor_ot_travel_c"]=>
    string(4) "0.00"
    ["ticket_labor_travel_c"]=>
    string(4) "0.00"
    ["ticket_labor_ot_c"]=>
    string(4) "0.00"
    ["ticket_labor_reg_c"]=>
    string(4) "0.00"
    ["ticket_labor_user_id"]=>
    string(1) "0"
    ["ticket_labor_tot_hours"]=>
    string(4) "0.00"
    ["ticket_labor_reg_hours"]=>
    string(4) "0.00"
    ["ticket_labor_ot_hours"]=>
    string(4) "0.00"
    ["ticket_labor_travel_hours"]=>
    string(4) "0.00"
    ["ticket_labor_ot_travel_hours"]=>
    string(4) "0.00"
  }
}

(同时请记住,这与上一个问题非常相似,上面的数组可能有70个数组)

我得到了类似的东西:

array(10) {
  ["ticket_labor_ot_travel_c"]=>
  string(5) "0.00"
  ["ticket_labor_travel_c"]=>
  string(5) "0.00"
  ["ticket_labor_ot_c"]=>
  string(5) "0.00"
  ["ticket_labor_reg_c"]=>
  string(5) "0.00"
  ["ticket_labor_user_id"]=>
  string(5) "0.00"
  ["ticket_labor_tot_hours"]=>
  string(4) "0.00"
  ["ticket_labor_reg_hours"]=>
  string(4) "0.00"
  ["ticket_labor_ot_hours"]=>
  string(4) "0.00"
  ["ticket_labor_travel_hours"]=>
  string(4) "0.00"
  ["ticket_labor_ot_travel_hours"]=>
  string(4) "0.00"
}

一个数组,压缩了前一个数组数组的所有数组,并将它们的$key=>$value加在一起。

问题是什么?我var_dumpecho所在的地方,$key$value甚至是$innerArray

我最终收到了大量的通知:

  

注意:未定义的索引:ticket_labor_ot_travel_hours in    C:\ XAMPP \ htdocs中\有效值\站点\网络\模块\报告\控制器\ Index.controller.php   在线 146

$innerArray中的每个密钥的每个通知都不同。所以我想让我们做if(isset($key) && isset($value)){ ... } Nope,同样的问题。

我已经检查了外部数组,并且可以确保进入的是我想要的,所有键都已设置。

如果您想知道第146行是:$result[$key] = number_format($result[$key] + $value, 2);

任何帮助?

4 个答案:

答案 0 :(得分:0)

首先,要修复未定义的索引问题,请在该行上方添加一个检查:

if(!array_key_exists($key, $result))
    $result[$key] = 0;

其次,你的数组压缩的原因是因为你在两个级别深度循环而你的$results数组只有一个深度。我猜你想要求和每次迭代的值并在最后输出它......就像这样:

$result[$key] += $value;

在输出数据时启用number_format功能。

答案 1 :(得分:0)

这是在您第一次访问$result[$key]进行阅读时发生的,而未初始化。 为了修复你需要添加一个检查,如果它没有初始化你将它替换为0。

$result[$key] = number_format((array_key_exists($key, $result)?$result[$key]:0) + $value, 2);

issetarray_key_exists之间的差异:

$a = array('key1' => 'フーバー', 'key2' => null);

isset($a['key1']);             // true
array_key_exists('key1', $a);  // true

isset($a['key2']);             // false
array_key_exists('key2', $a);  // true

取自:Difference between isset and array_key_exists

答案 2 :(得分:0)

尝试将错误的行替换为:

$result[$key] = isset($result[$key]) ? $result[$key] + $value : 0;

你不想在那时对它进行数字格式化,因为一旦你达到数千,你就不能添加1,000 + 1,因为,

这是真的,你可以在number_format函数中设置end参数不使用千位分隔符,但它会开始增加复杂性并降低性能(因为当你没有正确使用时,为什么要反复调用方法函数输出直到最后一次迭代对函数的最后调用,以及为什么在代码中的那一点不需要时增加复杂性?)。

例如,当您将其显示给最终用户时,您需要在最后对其进行数字格式化。如果要在计算过程中将精度保持在2位小数。您可以使用round($result[$key] + $value, 2)代替。

答案 3 :(得分:0)

而不是

$result = array();

使用

$result = array_shift($ticketLabors);

这将使用$result的第一个子数组初始化$ticketLabors,同时将其从后者中删除。

但你最好在if之后把它放好。