2010-12-23 7 views
6


मैं इस तरह एक सरणी है:php सरणियों में रेंज जैसी कार्यप्रणाली रिवर्स

array(0, 2, 4, 5, 6, 7, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99); 

और मैं एक निम्न स्ट्रिंग के रूप में यह प्राप्त करना चाहते हैं:

0, 2, 4-7, 90+

किसी भी उदाहरण इससे पहले कि मैं अपने सिर से बाल खींचना शुरू कर दूं?
धन्यवाद।

अद्यतन:
यहाँ अंतिम समाधान मैं @ एंडी कोड ले, और यह थोड़ा संशोधित करने के बाद किया जाता है।

function rangeArrayToString($rangeArray, $max = 99) { 
    sort($rangeArray); 
    $first = $last = null; 
    $output = array(); 

    foreach ($rangeArray as $item) { 
     if ($first === null) { 
      $first = $last = $item; 
     } else if ($last < $item - 1) { 
      $output[] = $first == $last ? $first : $first . '-' . $last; 
      $first = $last = $item; 
     } else { 
      $last = $item; 
     } 
    } 

    $finalAddition = $first; 

    if ($first != $last) { 
     if ($last == $max) { 
      $finalAddition .= '+'; 
     } else { 
      $finalAddition .= '-' . $last; 
     } 
    } 

    $output[] = $finalAddition; 

    $output = implode(', ', $output); 
    return $output; 
} 
+1

एआरएम ... शायद आपको इसे हल करने के लिए कुछ * प्रोग्रामिंग * का उपयोग करने का प्रयास करना चाहिए? मैं आपको अपमानित करने की कोशिश नहीं कर रहा हूं, लेकिन यदि आप अपने दिमाग का थोड़ा सा उपयोग करते हैं तो यह एक साधारण काम है। –

+3

मैं वास्तव में समझ में नहीं आता कि अभी भी ऐसे लोग हैं जो आपके जैसे टिप्पणियों पर टिप्पणी करते हैं, उपयोगकर्ताओं के प्रश्न पूछने के लिए किए गए साइटों में। यदि आपको लगता है कि यह कोई ब्रेनर नहीं है, तो आपको इस प्रश्न का उत्तर देने की आवश्यकता नहीं है, लेकिन मुझे बता रहा है कि मैं इसे प्रोग्रामिंग करके करने की कोशिश कर सकता हूं, बिल्कुल मदद नहीं कर रहा है। मुझे कोड उदाहरण देखना पसंद है। यह प्रतिमानों में चिपके हुए नहीं होने से मेरे कोडिंग प्रथाओं को समृद्ध करता है। – Doron

+1

यह साइट तब होती है जब आपको कोड के साथ परेशानी होती है, न कि जब आप स्वयं कोडिंग करना नहीं चाहते हैं और किसी और को आपके लिए ऐसा करना पसंद करेंगे। अगर आप कुछ ऐसा पोस्ट करेंगे जो आपने कोशिश की और काम नहीं किया होता तो यह कुछ अलग होता। –

उत्तर

11
$first = $last = null; 
$output = array(); 

foreach ($array as $item) { 
    if ($first === null) { 
     $first = $last = $item; 
    } else if ($last < $item - 1) { 
     $output[] = $first == $last ? $first : $first . '-' . $last; 
     $first = $last = $item; 
    } else { 
     $last = $item; 
    } 
} 

$output[] = $first == $last ? $first : $first . '+'; 
$output = join(', ', $output); 
+0

निश्चित रूप से यह मानते हुए कि सरणी को क्रमबद्ध किया गया है, अन्यथा asort() सरणी पहले – Andy

+0

अच्छा समाधान, अच्छी तरह से काम करने लगता है। +1 –

+0

+1 (मुझे बस एहसास हुआ कि मैंने जो लिखा है वह मूल रूप से आपके जैसा था) ... – ircmaxell

0
function makeRange($array, $last=array(), $done=array()){ 
    if ($array == array()) { 
     return $done; 
    } 

    $h = $array[0]; 
    $t = array_slice($array, 1); 

    if ($last == array()) { 
     $last = array($array[0], $array[0]); 
    } 
    if ($t[0] == 1 + $last[1]) { 
     return makeRange($t, array($last[0], $h+1), $done); 
    } 
    $done[] = $last; 
    return makeRange($t, array(), $done); 
} 

print_r(makeRange(array(1,2,3,5,6,7, 9, 11,12,13,18))); 

// Output 

Array 
(
    [0] => Array 
     (
      [0] => 1 
      [1] => 3 
     ) 

    [1] => Array 
     (
      [0] => 5 
      [1] => 7 
     ) 

    [2] => Array 
     (
      [0] => 9 
      [1] => 9 
     ) 

    [3] => Array 
     (
      [0] => 11 
      [1] => 13 
     ) 

    [4] => Array 
     (
      [0] => 18 
      [1] => 18 
     ) 

) 

आप आवश्यक 4-7 सरणी (4,7) के बजाय देने के लिए एक सरल डेकोरेटर जोड़ सकते हैं। यह मैंने छोड़ा क्योंकि डेटा का दृश्य अलग होना चाहिए।

उम्मीद है कि मदद करता है।

संबंधित मुद्दे