我有一个数组
$hourly = array(
"01" => "0",
"02" => "0",
"03" => "0",
"04" => "0",
"05" => "0",
"06" => "0",
"07" => "0",
"08" => "0",
"09" => "0",
"10" => "0",
"11" => "0",
"12" => "0",
"13" => "0",
"14" => "0",
"15" => "0",
"16" => "0",
"17" => "0",
"18" => "0",
"19" => "0",
"20" => "0",
"21" => "0",
"22" => "0",
"23" => "0"
);
我有一堆数据,如“01”,“03”和“21”,我想在数组中添加(+1)到该特定值。因此,对于数据集“01”,“03”,“21”,“01”,“22”,结果数组将是
$hourly = array(
"01" => "2",
"02" => "0",
"03" => "1",
"04" => "0",
"05" => "0",
"06" => "0",
"07" => "0",
"08" => "0",
"09" => "0",
"10" => "0",
"11" => "0",
"12" => "0",
"13" => "0",
"14" => "0",
"15" => "0",
"16" => "0",
"17" => "0",
"18" => "0",
"19" => "0",
"20" => "0",
"21" => "1",
"22" => "1",
"23" => "0"
);
我怎么能这样做?是否有向数组元素添加1的函数?
答案 0 :(得分:20)
$updates = array("01","03","21","01","22");
foreach($updates as $num) {
$hourly[$num]++;
}
答案 1 :(得分:14)
$hours = array("01", "03", "21" );
foreach($hours as $hour) {
$hourly[$hour] += 1;
}
答案 2 :(得分:6)
通常情况下,您可以这样做:
$array["key"]++;
但是,你的阵列有一些你应该修复的特性;
这些都不会使您的脚本无效,但可以避免不一致和不必要的性能损失。
答案 3 :(得分:1)
你可以使用完全“功能性”的方法,即使它是PHP ,甚至ID也不是很漂亮;-) 但它有效(PHP> = 5.3.0):
...
$fr = 1; $to = 23;
# generate original Array
$hourly = array_combine(
array_map( function($n){return sprintf("%02s",$n);}, range($fr,$to) ), # Keys
array_map( function($n){return 0;}, range($fr,$to) ) # Values
);
$updates = Array('01','03','21','01','22');
# update values based on keys found in $updates
array_walk( $updates, function($u){global $hourly; $hourly[$u]++;} );
...
此致
RBO
答案 4 :(得分:0)
如果您只想增加数组中的每个元素,可以使用:
<?php
foreach($hourly as &$element) {
$element++;
}
?>
但是,如果您只想增加包含值的元素,可以使用:
<?php
foreach($hourly as &$element) {
$element = $element ? $element + 1 : $element;
}
?>
答案 5 :(得分:0)
您可以构建一个包含更新信息的数组($new = array('01' => '02','03' => '01',)
等,然后使用array_replace($hourly,$new)
或array_merge($hourly,$new)
。也可能有其他功能。
答案 6 :(得分:0)
处理前导零很麻烦,无论您采用哪种方法。您要么必须处理混合字符串/整数索引,要么必须确保将所有内容强制为整数,但如果显示很重要,请记住将前导零放回去。
如果你曾经用类似 array_merge()
的东西操作过一个数组,你最好强制所有索引为整数,因为如果序列中有间隙,它会重新编号整数索引。
以下仅当输入确实在数组中并且值一致时才有效(即“一”总是出现为“01”而永远不会出现为“1”(反之亦然) )):
$counts = array_count_values( $inputs );
由于值 <10 的前导零,它们被解释为字符串,您可能会或可能不会注意到这取决于您访问计数的方式。如果您使用硬编码索引,则需要确保包含前导零,例如 $counts["01"]
而不是 $counts["1"]
。如果您只关心已经看到的值,一个简单的 foreach...as
就足够了:
foreach( $counts as $value => $count ){ print "$value => $count\n"; }
如果您要遍历每个可能的值(或以其他方式随机访问它们),则需要一些麻烦:
function lpad( $index ){ return str_pad($index,2,"0",STR_PAD_LEFT); }
for($i=0;$i<24;$i++){ print ($counts[lpad($i)]??0)." "; }
或者如果您想避免性能调用的函数
$lpad = array_keys($hourly); ### IMPORTANT! ASSUMES $hourly ACTUALLY STARTS WITH "00"
for($i=0;$i<24;$i++){ print ($counts[$lpad[$i]]??0)." "; }
如果您的 PHP 版本没有 ??
,则 for
循环的主体应该类似于
print (is_null( $p = $counts[$lpad[$i]] )? 0 : $p )." ";
稀疏计数(如果它们从未出现,则会跳过一些小时)
$counts = array_reduce( $inputs, function($c, $i){ $c[(integer)$i]++; return $c; }, array() );
完整的计数范围(所有小时,即使计数为零)
$counts = array_reduce( $inputs, function($c, $i){ $c[(integer)$i]++; return $c; }, array_fill( 0, 24, 0 ));