2010-08-13 13 views
8

Mam tablicęDodaj do wartości Array (+1)

$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" 
      ); 

I mam kilka danych, takich jak "01" i "03" i "21" i chcę dodać (+1) do tej określonej wartości w tablicy. Tak ustawić dane z „01”, „03”, „21”, „01”, „22” powstały tablica będzie

$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" 
      ); 

Jak mogłem do tego zabrać? Czy istnieje funkcja dodawania 1 do elementu tablicy?

+1

Co próbujesz osiągnąć? Przykładowe dane/objaśnienia nie są do końca zsynchronizowane. –

+0

Chce on zwiększyć o 1 wartości, które pojawiają się w drugiej tablicy. –

+1

Jeśli chcesz wykonywać na nich operacje matematyczne, dlaczego łańcuchy wartości są ciągami, a nie liczbami całkowitymi? –

Odpowiedz

13
$hours = array("01", "03", "21"); 
foreach($hours as $hour) { 
    $hourly[$hour] += 1; 
} 
0

Jeśli po prostu chcesz zwiększyć każdy element tablicy, można użyć:

<?php 

    foreach($hourly as &$element) { 
     $element++; 
    } 

?> 

Jednakże, jeśli tylko chcą zwiększyć elementy, które posiadają wartość, można użyć:

<?php 

    foreach($hourly as &$element) { 
     $element = $element ? $element + 1 : $element; 
    } 

?> 
+0

Chcę na przykład podać wartości i zwiększyć tylko te ("01", "03", "21", "01", "22"). Zastanawiałem się, czy w ogóle istnieje potrzeba uniknięcia konieczności przechodzenia przez całą tablicę dla każdej wartości i dodawania +1 do tej konkretnej wartości, ponieważ lista danych może być bardzo długa. – Steven

+0

Nie - nie ma sposobu robienia tego bez iteracji. (Powiedziawszy, możesz oczywiście po prostu dodać wartość za pomocą gettera i pozostawić tablicę nietkniętą.) Do czego służy ten kod? (Zgaduję, że kiedyś jest oparty na czasie?) –

19
$updates = array("01","03","21","01","22"); 
foreach($updates as $num) { 
    $hourly[$num]++; 
} 
6

Normalnie, byłbyś w stanie zrobić:

$array["key"]++; 

Jednak twoje tablice mają kilka dziwactw, które powinieneś naprawić;

  • Twoje kluczowe wartości to w rzeczywistości łańcuchy. Jeśli chcesz, aby liczby można było zwiększać, powinieneś używać liczb od początku. Jeśli zapisujesz ciąg znaków i zwiększasz go o powyższą składnię, zostanie on przekształcony w liczbę całkowitą.
  • Tablice przechowują łańcuch lub liczby jako klucze. Używasz obu. "01" zostanie zapisany jako klucz ciąg, "10" zostanie zapisany jako liczba. Rozważ przechowywanie tylko liczb jako kluczy.

Żaden z nich nie powoduje, że twój skrypt nie działa, ale można uniknąć niezgodności i niepotrzebnego trafienia w wydajność.

0

Można skonstruować tablicę z zaktualizowaną informacją ($new = array('01' => '02','03' => '01',) etc, a następnie użyć array_replace($hourly,$new) lub array_merge($hourly,$new). Prawdopodobnie istnieje alternatywne funkcje zbyt.

1

można wykorzystywać podejście zupełnie „funkcjonalne”, nawet jeśli jest to PHP a nawet id jego niezbyt piękny ;-) Ale to działa (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]++;}); 

... 

Pozdrowienia

rbo

+1

Zupełnie zbyt skomplikowany na to, co zadał OP – Dave