2015-07-09 13 views
8

मैं एक mysql क्वेरी चल रहा हूँ और जिसके परिणामस्वरूप सरणी कुछ इस तरह है, कि हर महीने परिवर्तन:भरण सरणी

Array( 
[0] => Array 
    (
     [day] => 2 
     [count] => 10 
    ) 

[1] => Array 
    (
     [day] => 4 
     [count] => 39 
    ) 

[2] => Array 
    (
     [day] => 5 
     [count] => 51 
    ) 
    ) 

मैं दिन जोड़ने के लिए तो मैं प्राप्त करना चाहते हैं 31 दिनों, लोगों को जोड़ा 0 से भर दिया जाएगा, इस तरह:

Array( 
[0] => Array 
    (
     [day] => 1 
     [count] => 0 
    ) 

[1] => Array 
    (
     [day] => 2 
     [count] => 10 
    ) 

[2] => Array 
    (
     [day] => 3 
     [count] => 0 
    ) 

[3] => Array 
    (
     [day] => 4 
     [count] => 39 
    ) 
    ) 

मैं दूसरे उदाहरण में 31 दिनों के साथ सरणी को भरने के लिए, दिन का उपयोग करने और डेटा वहां पहले से मौजूद गिनती ... की तरह चाहते हैं ... दिन 1 और 3 वांछित ... इसलिए मैंने उन्हें गिनती मान 0 के साथ जोड़ा ... क्रम में ... 1 ~ 31 दिन

कुछ महीने वहाँ कोई कॉल है

SELECT day(`dates`) day, count(`dates`) count FROM `calls` where month(dates) = 7 

तो हर महीने "दिन" के विभिन्न राशि है,:

क्वेरी बहुत सरल है।

+0

पूरी तरह से साफ़ नहीं जरूरत नहीं है। आपको क्या चाहिए ?? – MKD

+0

आप संचयी गणना चाहते हैं? –

+0

मैं अपने पास एक नया सरणी बनाना चाहता हूं ... 31 दिनों के साथ ... कभी-कभी मेरी सरणी में 20 दिन होते हैं, जो वहां नहीं हैं उन्हें गिनती मान 0 के साथ जोड़ा जाना चाहिए ... बस उदाहरण ... दिन 1 और 3 पहले में नहीं थे, इसलिए दूसरे में वे हैं ... गिनती मान 0 – Edgar

उत्तर

2

इसके अलावा इस कोशिश, अपनी आवश्यकता के अनुसार range(1,10) संशोधित

[[email protected] tmp]$ cat test.php 
<?php 

$array=array( 
       array("day"=>2,"count"=>10), 
       array("day"=>4,"count"=>39), 
       array("day"=>5,"count"=>51) 
      ); 


function modify_array($array,$range) 
{ 
    $tmp = array(); 
    array_map(function($_) use (&$tmp){ $tmp[$_] = array("day"=>$_,"count"=>0); },$range); 
    $output = array_combine(array_column($array,"day"), $array) + $tmp; 
    ksort($output); 
    return array_values($output); 
} 

// Output - modify range(1,10) as per your wish 
print_r(modify_array($array, range(1,10))); 

?> 

आउटपुट

[[email protected] tmp]$ php test.php 
Array 
(
    [0] => Array 
     (
      [day] => 1 
      [count] => 0 
     ) 

    [1] => Array 
     (
      [day] => 2 
      [count] => 10 
     ) 

    [2] => Array 
     (
      [day] => 3 
      [count] => 0 
     ) 

    [3] => Array 
     (
      [day] => 4 
      [count] => 39 
     ) 

    [4] => Array 
     (
      [day] => 5 
      [count] => 51 
     ) 

    [5] => Array 
     (
      [day] => 6 
      [count] => 0 
     ) 

    [6] => Array 
     (
      [day] => 7 
      [count] => 0 
     ) 

    [7] => Array 
     (
      [day] => 8 
      [count] => 0 
     ) 

    [8] => Array 
     (
      [day] => 9 
      [count] => 0 
     ) 

    [9] => Array 
     (
      [day] => 10 
      [count] => 0 
     ) 

) 

- PHP के पुराने संस्करण के लिए comment--

के लिए संपादित करें जो array_column

function modify_array($array,$range) 
{ 
    $tmp = array(); 
    array_map(function($_) use (&$tmp){ $tmp[$_] = array("day"=>$_,"count"=>0); },$range); 
    $output = array_combine(array_map(function($e){return $e["day"];}, $array), $array) + $tmp; 
    ksort($output); 
    return array_values($output); 
} 
+2

ठंडा दृष्टिकोण। – billynoah

+1

array_column केवल php 5.5 के लिए है इसलिए मुझे मेरा अपडेट करना पड़ा ... गधे में दर्द क्या था ... लेकिन यह भी काम करता है ... मैं दोनों कोशिश करने जा रहा हूं ... – Edgar

+1

@Edgar: I संपादित मेरी पोस्ट में एक नज़र है, जो अब पुराने संस्करण का समर्थन करता है –

3

मैं सभी तिथियों को रखने के लिए आपके डेटाबेस में कैलेंडर तालिका बनाने की अनुशंसा करता हूं। फिर आप इस तालिका से चयन कर सकते हैं और प्रति दिन कुल गणना प्राप्त करने के लिए अपने अन्य डेटा में शामिल हो सकते हैं। This article कैलेंडर तालिका बनाने के लिए एक अच्छी जगह है और this stackoverflow post में एक ही प्रश्न और आपकी समस्या का उत्तर है। पहली बार अपने लक्ष्य रखा

वहाँ php समाधान, बार-बार दोहराना के साथ ही इस तरह के php दिनांक समय और DateInterval कक्षा में बनाया का उपयोग कर दिनांक सीमा के रूप this stackoverflow question

0
$result = your database query result; 
$days = array(); 
for($i=0;$i<=31;$i++){ 
{ 
    foreach($result as $aresult){ 
     if(($aresult['day']-1)==$i){ 
      $days[i] = $aresult; 
      break; 
     } 
    } 
} 
+0

मैंने -1 लिया और 'else {$ days [$ i] = array ('day' => $ i, 'count' => 0) जोड़ा; } 'foreach के अंदर और यह काम किया, धन्यवाद – Edgar

+1

यह बहुत अनावश्यक अतिरिक्त लूपिंग बनाता है। यह काम कर सकता है लेकिन यह अक्षम है। – billynoah

1

में उल्लेख किया है मान लिया जाये कि आप जुलाई की तुलना में अधिक महीने के लिए ऐसा करते हैं कर रहे हैं एक चर के रूप में महीने और दिनों की राशि प्राप्त:

$month = '7'; 
$daysInMonth = cal_days_in_month(CAL_GREGORIAN, $month, 2003); 

तो आपकी क्वेरी चलाने के लिए और परिणामों पर पुनरावृति एक सरणी दिन द्वारा अनुक्रमित निर्माण करने के लिए:

while ($row = $query->fetch_assoc()) { 
    $results[$row['day']] = $row; 
} 

अब आप एक सरल for पाश कर सकते हैं और लापता टुकड़े में भरने:

for ($i = 1; $i <= $daysInMonth; $i++) { 
    if (!isset($results[$i])) { 
     $results[$i] = array(
      'day' => $i, 
      'count' => 0 
     ); 
    } 
} 
संबंधित मुद्दे