2013-11-24 4 views
0

Это возможная дублирующаяся запись. Несчастливо я не могу понять это из других записей в Stackoverflow. Поэтому, пожалуйста, помогите, если вы можете :)Подсчет значений в многомерном массиве

Я играю с мини-скриптом статистики в php, чтобы показать некоторые основные статистические данные.

У меня есть многомерный массив, который выглядит следующим образом:

$found_data = 
array( 
    array('2011-11-02' => 'mobile'), 
    array('2011-11-02' => 'mobile'), 
    array('2011-11-04' => 'mobile'), 
    array('2011-11-08' => 'Desktop'), 
    array('2011-11-08' => 'mobile'), 
    array('2011-11-08' => 'mobile'), 
    array('2011-11-08' => 'mobile'), 
    array('2011-11-15' => 'mobile'), 
    array('2011-11-18' => 'mobile'), 
    array('2011-11-21' => 'Desktop'), 
    array('2011-11-23' => 'mobile'), 
    array('2011-11-28' => 'Desktop'), 
    array('2011-11-30' => 'mobile') 
); 

Теперь я хочу, чтобы представить эти данные, как это:

2011-11-01: 0 from mobile and 0 from desktop 
2011-11-02: 2 from mobile and 0 from desktop 
... 
2011-11-30: 1 from mobile and 0 from desktop 

Я уверен, что вы получили эту идею.

Я попробовал следующие много вариантов, но ничего не работает:

echo count(array_keys($found_data['2011-11-02'], "mobile")); 

Любая помощь очень ценится :)

ответ

0

я решил его в другом WY, чем выше предложил.

Если какой-либо один должен быть заинтересован, это ответ:

$found_data = 
array( 
    array('2011-11-02' => 'Mobile'), 
    array('2011-11-02' => 'Mobile'), 
    array('2011-11-04' => 'Mobile'), 
    array('2011-11-08' => 'Desktop'), 
    array('2011-11-08' => 'Mobile'), 
    array('2011-11-08' => 'Mobile'), 
    array('2011-11-08' => 'Mobile'), 
    array('2011-11-15' => 'Mobile'), 
    array('2011-11-18' => 'Mobile'), 
    array('2011-11-21' => 'Desktop'), 
    array('2011-11-23' => 'Mobile'), 
    array('2011-11-28' => 'Desktop'), 
    array('2011-11-30' => 'Mobile') 
); 



foreach($found_data as $single_data) 
{ 
    foreach($single_data as $data => $key) 
    { 
     $array_combined[$data]['Mobile'] = array(); 
     $array_combined[$data]['Tablet'] = array(); 
     $array_combined[$data]['Desktop'] = array();     
    } 
} 


foreach($found_data as $single_data) 
{ 
    foreach($single_data as $data => $key) 
    { 
     if($key=='Desktop') 
      array_push($array_combined[$data]['Desktop'], $key); 
     else if($key=='Tablet') 
      array_push($array_combined[$data]['Tablet'], $key); 
     else if($key=='Mobile') 
      array_push($array_combined[$data]['Mobile'], $key); 

    } 
} 


$startdate = strtotime('2011-11-01 00:00:01'); 
$days = 30; 

echo 'Total hits the last 30 days: '.count($found_data).'<br />'; 

echo 'Desktop hits the last 30 days<br />'; 
for ($i = 0; $i <= $days; $i++) { 
    $date = date('Y-m-d', $startdate+$i*60*60*24); 
    printf("%s\t%s\n", $date, array_key_exists($date, $array_combined) ? count($array_combined[$date]['Desktop']) : 0); 
    echo '<br />'; 
} 

echo 'Tablet hits the last 30 days<br />'; 
for ($i = 0; $i <= $days; $i++) { 
    $date = date('Y-m-d', $startdate+$i*60*60*24); 
    printf("%s\t%s\n", $date, array_key_exists($date, $array_combined) ? count($array_combined[$date]['Tablet']) : 0); 
    echo '<br />'; 
} 

echo 'Mobile hits the last 30 days<br />'; 
for ($i = 0; $i <= $days; $i++) { 
    $date = date('Y-m-d', $startdate+$i*60*60*24); 
    printf("%s\t%s\n", $date, array_key_exists($date, $array_combined) ? count($array_combined[$date]['Mobile']) : 0); 
    echo '<br />'; 
} 

Propably не лучшее решение, но работает как intented.

2

Вы можете не индексировать ваш $ found_data как это: $found_data['2011-11-02'] потому, что у вас есть нет ключа с именем '2011-11-02'. Ваше объявление $ found_data эквивалентно:

$found_data = 
array( 
    0 => array('2011-11-02' => 'mobile'), 
    1 => array('2011-11-02' => 'mobile'), 
    2 => array('2011-11-04' => 'mobile'), 
    ... // and so on 
); 

Я знаю, что вы используете многомерный использовать одни и те же клавишу несколько раз, но, как структуру выше показывает, вы не можете просто использовать array_keys.

Один из способов получить то, что вы хотите, чтобы:

  1. Создайте переменную результата, инициализации, как пустой массив
  2. Получить следующий элемент в $ found_data
  3. Получить key и value пункта
  4. Проверить, есть ли key в случае, если да, приращивайте соответствующие value. В противном случае создайте новый массив с mobile и desktop в качестве ключей и используйте value, чтобы определить, какой из них следует инициализировать с помощью 1 (другой - 0). Назначают этот массив результат с ключом key

Ожидаемая структура результате массив выглядит так:

$result = array(
    '2011-11-02' => array(
     'mobile' => 2, 
     'desktop' => 1, 
    ), 
    '2011-11-04' => array(
     'mobile' => 0, 
     'desktop' => 1, 
    ), 
    '2011-11-05' => array(
     'mobile' => 2, 
     'desktop' => 0, 
    ), 
); 
+0

Я не совсем уверен, что вы имеете в виду. Можете ли вы привести мне пример, чтобы указать мне в правильном направлении? –

+0

Я обновил свой ответ – LeleDumbo

+0

Это отличная идея! Я проверю позже сегодня и напишу после, +1 на данный момент :) –

Смежные вопросы