Php 数组中同名情况下如何进行数组合并
我有多个数组值,我想在现有数组值中形成新数组,如果打印类型相同,则返回单个数组并计算相同打印时间的时间Php 数组中同名情况下如何进行数组合并,php,arrays,array-merge,Php,Arrays,Array Merge,我有多个数组值,我想在现有数组值中形成新数组,如果打印类型相同,则返回单个数组并计算相同打印时间的时间 Actual Array: ( [0] => Array ( [Time] => 00:45 [PlottingType] => Research ) [1] => Array (
Actual Array:
(
[0] => Array
(
[Time] => 00:45
[PlottingType] => Research
)
[1] => Array
(
[Time] => 00:45
[PlottingType] => admin
)
[2] => Array
(
[Time] => 00:45
[PlottingType] => admin
)
[3] => Array
(
[Time] => 00:45
[PlottingType] => Research
)
[4] => Array
(
[Time] => 00:30
[PlottingType] => Research
)
)
Expected Array:
Array
(
[0] => Array
(
[Time] => 01:30
[PlottingType] => Research
)
[1] => Array
(
[Time] => 01:30
[PlottingType] => admin
)
)
将相同的打印类型时间计算为单个索引到单个数组中。因此,请建议适当的解决方案。看起来您正在尝试删除数组中的重复项。在这种情况下,请使用array_unique函数
$expectedarray = array_unique($actualarray);
print_r($expectedarray);
如果要计算值,请使用数组\u计数\u值intead array\u unique
有关更多信息,请参阅此处:
它将给出这样的输出
[0] => Array
(
[Time] => 2:00
[PlottingType] => Research
)
[1] => Array
(
[Time] => 01:30
[PlottingType] => admin
)
您可以按以下方式进行检查:
foreach($u as $expectedarray)
{
print_r($u);
}
可以使用strottime和date,但我不想这样做,因此代码稍微长一点。如果要从结果中删除最终键,请对其应用函数数组_值
结果
Array
(
[Research] => Array
(
[Time] => 02:00
[PlottingType] => Research
)
[admin] => Array
(
[Time] => 01:30
[PlottingType] => admin
)
)
ps:还有另一种方式
print_r(array_reduce($data, function($result, $item) {
$key = $item['PlottingType'];
if (!isset($result[$key]))
$result[$key] = $item;
else
{
$time = strtotime('0:' . $result[$key]['Time']);
list($h, $m) = explode(':', $item['Time']);
$time = strtotime('+' . $h . ' minutes', $time);
$time = strtotime('+' . $m . ' seconds', $time);
$result[$key]['Time'] = date('i:s', $time);
}
return $result;
}, array()));
在这里,我使用分钟作为秒,小时作为分钟,所以答案可能超过24小时,最多60小时
pps:好的,你不能自己给变量赋值,我会给你写下来的
$data = array_values(array_reduce($data, function($result, $item) {
$key = $item['PlottingType'];
if (!isset($result[$key]))
$result[$key] = $item;
else
{
$time = strtotime('0:' . $result[$key]['Time']);
list($h, $m) = explode(':', $item['Time']);
$time = strtotime('+' . $h . ' minutes', $time);
$time = strtotime('+' . $m . ' seconds', $time);
$result[$key]['Time'] = date('i:s', $time);
}
return $result;
}, array()));
嗯。我正在删除旧答案,这是新的有效答案。我希望你能做一些必要的小改动
function add_minutes($time_1, $time_2) {
$temp = explode(':', $time_1);
$hr_1 = $temp[0]; $min_1 = $temp[1];
$temp = explode(':', $time_2);
$hr_2 = $temp[0]; $min_2 = $temp[1];
$min_2 = $min_2+$min_1;
$min_1 = intval($min_2/60);
$hr_2 = $hr_2 + $hr_1;
$hr_2 += $min_1;
$min_2 = $min_2%60;
$min_2 = sprintf('%02d', $min_2); $hr_2 = sprintf('%02d', $hr_2);
return $hr_2.':'.$min_2;
}
$actual_array = array();
$actual_array[] = array('Time' => '01:45', 'PlottingType' => 'Research');
$actual_array[] = array('Time' => '00:45', 'PlottingType' => 'admin');
$actual_array[] = array('Time' => '00:45', 'PlottingType' => 'admin');
$actual_array[] = array('Time' => '00:45', 'PlottingType' => 'Research');
$actual_array[] = array('Time' => '00:45', 'PlottingType' => 'Research');
$single_array = array();
foreach($actual_array as $val) {
if (key_exists($val['PlottingType'], $single_array)) {
$single_array[$val['PlottingType']] = add_minutes($val['Time'], $single_array[$val['PlottingType']]);
} else {
$single_array[$val['PlottingType']] = $val['Time'];
}
}
$output_array = array();
foreach ($single_array as $key => $value) {
$output_array[] = array('PlottingType' => $key, 'Time' => $value);
}
// $output_array this is your answer.
echo '<pre>'; var_dump($output_array);
假设您使用的是PHP安全吗?根据您的样本[Time]=>01:30[PlottingType]=>Research-可能是02:00?@Sami它有预期的输出,滚动列表down@abhiv为什么是02.15??0:45+0:45+0:30=2:00是否正确,但我还想计算相同绘图类型的时间。是否要时间之和\u绘图?答案是正确的,但哪一个是最终数组,用于返回。因为您要打印整个数组。删除函数print\u r并将结果赋给另一个变量。我只需要一个键,不需要不同的键。。类似于“$result['eventlist'][]”。我制作了与您要求的完全相同的数组。我写了-如果你不想要这个键,请对结果应用array_值。@abhiv我已经为你的变量添加了赋值。我检查了所有代码-没有错误,这意味着你做错了什么。请将时间转换为分钟。
$data = array_values(array_reduce($data, function($result, $item) {
$key = $item['PlottingType'];
if (!isset($result[$key]))
$result[$key] = $item;
else
{
$time = strtotime('0:' . $result[$key]['Time']);
list($h, $m) = explode(':', $item['Time']);
$time = strtotime('+' . $h . ' minutes', $time);
$time = strtotime('+' . $m . ' seconds', $time);
$result[$key]['Time'] = date('i:s', $time);
}
return $result;
}, array()));
function add_minutes($time_1, $time_2) {
$temp = explode(':', $time_1);
$hr_1 = $temp[0]; $min_1 = $temp[1];
$temp = explode(':', $time_2);
$hr_2 = $temp[0]; $min_2 = $temp[1];
$min_2 = $min_2+$min_1;
$min_1 = intval($min_2/60);
$hr_2 = $hr_2 + $hr_1;
$hr_2 += $min_1;
$min_2 = $min_2%60;
$min_2 = sprintf('%02d', $min_2); $hr_2 = sprintf('%02d', $hr_2);
return $hr_2.':'.$min_2;
}
$actual_array = array();
$actual_array[] = array('Time' => '01:45', 'PlottingType' => 'Research');
$actual_array[] = array('Time' => '00:45', 'PlottingType' => 'admin');
$actual_array[] = array('Time' => '00:45', 'PlottingType' => 'admin');
$actual_array[] = array('Time' => '00:45', 'PlottingType' => 'Research');
$actual_array[] = array('Time' => '00:45', 'PlottingType' => 'Research');
$single_array = array();
foreach($actual_array as $val) {
if (key_exists($val['PlottingType'], $single_array)) {
$single_array[$val['PlottingType']] = add_minutes($val['Time'], $single_array[$val['PlottingType']]);
} else {
$single_array[$val['PlottingType']] = $val['Time'];
}
}
$output_array = array();
foreach ($single_array as $key => $value) {
$output_array[] = array('PlottingType' => $key, 'Time' => $value);
}
// $output_array this is your answer.
echo '<pre>'; var_dump($output_array);