2010-09-14 18 views
24

में सबसे लंबे समय स्ट्रिंग मैं एक सरणी इसपीएचपी कम से कम/सरणी

$data = array(
    "163", 
    "630", 
    "43", 
    "924", 
    "4", 
    "54" 
); 

की तरह है मैं कैसे सबसे छोटी और सबसे बड़ा मान स्ट्रिंग की लंबाई नहीं संख्या मान के अनुसार यह से चुन सकते हैं। (इस उदाहरण के लिए यह 1 (छोटी) और 3 (सबसे बड़ा) है

+2

क्या आप सिर्फ स्ट्रिंग की लंबाई चाहते हैं या आप तार भी चाहते हैं? – NullUserException

+0

मुझे लगता है कि दोनों उपयोगी हैं –

+0

आपको इन नंबरों के बजाय तारों का उपयोग करके लंबाई/मूल्य भ्रम को हटा देना चाहिए था। –

उत्तर

42

लगता है जैसे आप का उपयोग करना चाहिए एक array_map()

// Convert array to an array of string lengths 
$lengths = array_map('strlen', $data); 

    // Show min and max string length 
echo "The shortest is " . min($lengths) . 
    ". The longest is " . max($lengths); 

ध्यान दें कि $lengths सरणी अवर्गीकृत है,: PHP का उपयोग 5.3.0+ आप closures का लाभ ले सकते आसानी से प्रत्येक स्ट्रिंग लंबाई के लिए संबंधित संख्या पुनर्प्राप्त करें।

+3

+1 साफ। आप बस 'array_map (' strlen ', $ डेटा) कर सकते हैं' हालांकि; – NullUserException

+0

@NullUser - वाह! मुझे नहीं पता क्यों, लेकिन मैंने सोचा कि काम नहीं किया> :( –

+0

* केवल * कारण मैंने इसे स्वीकार नहीं किया है क्योंकि यह 5.3.0 का उपयोग करता है, अन्यथा वास्तव में साफ है! –

2
$min = 100; 
$max = -1; 

foreach($data as $a){ 
    $length = strlen($a); 
    if($length > $max){ $max = $length; } 
    else if($length < $min){ $min = $length; } 
} 
+0

यह वही करता है जो ओप चाहता है। – Femaref

+0

धन्यवाद fernaref –

+0

हालांकि यह सही है। '$ min' को बहुत अधिक संख्या में शुरू करना है (int32.maxvalue शायद?) – Femaref

4

यहाँ brian_d's code के एक उन्नत संस्करण है:।

$min = PHP_INT_MAX; 
$max = -1; 

foreach ($data as $a) { 
    $length = strlen($a); 
    $max = max($max, $length); 
    $min = min($min, $length); 
} 
+0

यह अत्यधिक जटिल लगता है (प्रारंभिक '$ min' और' $ max' के अतिरिक्त), जब तक कि आप एक विशाल सरणी से निपट नहीं रहे हैं जिसे आप केवल एक बार पार करना चाहते हैं । –

3

हालांकि इस मामले में यह है क्योंकि आप उचित नहीं है ' सरणी दो बार traversing हो जाएगा, तो आप भी इस तरह array_reduce का उपयोग बाकी के खिलाफ प्रत्येक तत्व तुलना करने के लिए कर सकते हैं:।

<?php 

$data = array('163','630','43','42','999','31'); 
//Will return the longest element that is nearest to the end of the array (999) 
//That's why we use strlen() on the result. 
$max_l = strlen(array_reduce($data,'maxlen')); 
//Will return the shortest element that is nearest to the end of the array (31) 
$min_l = strlen(array_reduce($data,'minlen')); 

echo "The longest word is $max_l characters, while the shortest is $min_l\n"; 

function maxlen($k,$v) { 
     if (strlen($k) > strlen($v)) return $k; 
     return $v; 
} 
function minlen($k,$v) { 
     if ($k == '') return PHP_INT_MAX; 
     if (strlen($k) < strlen($v)) return $k; 
     return $v; 
} 
?> 

आप कर रहे हैं तो आप कर सकते हैं

<?php 
    $max_l = strlen(array_reduce($data, 
       function ($k,$v) { return (strlen($k) > strlen($v)) ? $k : $v; } 
     )); 

    $min_l = strlen(array_reduce($data, 
       function ($k,$v) { 
         if (!$k) return PHP_INT_MAX; 
         return (strlen($k) < strlen($v)) ? $k : $v; 
       } 
     )); 

echo "The longest word is $max_l characters, while the shortest is $min_l\n"; 
?> 
1
<?php 
$array = array(
    "163", 
    "630", 
    "43", 
    "924", 
    "4", 
    "54" 
); 
$arraycopy = array_map('strlen',$array); 
asort($arraycopy); 

$min = reset($arraycopy); 

//if you need a single 'minword' 
$minword = $array[key($arraycopy)]; 
//if you need them all 
$minwords = array_intersect_key($array,array_flip(array_keys($arraycopy,$min))); 


$max = end($arraycopy); 
//if you need a single 'maxword' 
$maxword = $array[key($arraycopy)]; 
//if you need them all: 
$maxwords = array_intersect_key($array,array_flip(array_keys($arraycopy,$max))); 

var_dump($min,$max,$minword,$maxword,$minwords,$maxwords); 
संबंधित मुद्दे