添加到数组值(+1)

时间:2010-08-13 15:14:24

标签: php

我有一个数组

$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的函数?

7 个答案:

答案 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"]++;

但是,你的阵列有一些你应该修复的特性;

  • 您的键值实际上是字符串。如果你想要增加数字,你应该从头开始使用数字。如果你存储一个字符串并使用上面的语法递增它,它将变成一个整数。
  • 数组将字符串或数字存储为键。你正在使用两者。 “01”将被存储为字符串键,“10”将被存储为数字。考虑仅将数字存储为密钥。

这些都不会使您的脚本无效,但可以避免不一致和不必要的性能损失。

答案 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 ));