2012-05-12 14 views
34

मुझे यह जांचने की आवश्यकता है कि सरणी में सभी मान एक ही चीज़ के बराबर हैं या नहीं।जांचें कि सरणी में सभी मान समान हैं

उदाहरण के लिए:

$allValues = array(
    'true', 
    'true', 
    'true', 
); 

सरणी में प्रत्येक मान 'true' के बराबर होती है तो मैं 'all true' गूंज करना चाहते हैं। यदि सरणी में कोई भी मान 'false' के बराबर है तो मैं 'some false'

इस पर कोई विचार कैसे कर सकता हूं इस पर कोई विचार है?

+0

कैसे मान सरणी में मिला? उन्हें सरल समानता के साथ क्यों न जांचें क्योंकि उन्हें सरणी में स्थानांतरित किया गया है और किसी भी * पूर्व पोस्ट वास्तव में * जांच (और इस प्रकार, यह प्रश्न) की आवश्यकता को रोक दिया गया है। यदि वे डेटाबेस से आते हैं तो इस ऑपरेशन को एसक्यूएल पक्ष पर संभाला जा सकता है। – rdlowrey

उत्तर

84

सभी मूल्यों बात आप नहीं चाहते के अस्तित्व के लिए परीक्षण मूल्य

if (count(array_unique($allvalues)) === 1 && end($allvalues) === 'true') { 


} 

या सिर्फ परीक्षण के बराबर।

if (in_array('false', $allvalues, true)) { 

} 

यदि आप सुनिश्चित हैं कि केवल 2 संभावित मान हैं जो सरणी में हो सकते हैं, क्योंकि यह अधिक कुशल है। लेकिन यदि संदेह में, एक धीमी प्रोग्राम गलत प्रोग्राम से बेहतर है, तो पहली विधि का उपयोग करें।

यदि आप दूसरी विधि का उपयोग नहीं कर सकते हैं, तो आपकी सरणी बहुत बड़ी है, और सरणी की सामग्री संभवतः 1 से अधिक मान रखने के लिए है (विशेष रूप से यदि मूल्य की शुरुआत के करीब होने की संभावना है सरणी), यह ज्यादा तेजी से निम्न करने के लिए हो सकता है: "। सच बिल्कुल नहीं"

function isHomogenous($arr) { 
    $firstValue = current($arr); 
    foreach ($arr as $val) { 
     if ($firstValue !== $val) { 
      return false; 
     } 
    } 
    return true; 
} 
+6

बाद के हिस्से को पसंद आया ... बजाय झूठे सच के लिए जाँच .. सुपर कुशल ... – CodeMonkey

+0

दूसरा तरीका बहुत अच्छा है ... –

+2

कारण है कि हम इस हिस्से की ज़रूरत है? "अंत ($ allvalues) === 'सत्य'" क्या कोई कृपया समझा सकता है? – Tebe

0
$alltrue = 1; 
foreach($array as $item) { 
    if($item!='true') { $alltrue = 0; } 
} 
if($alltrue) { echo("all true."); } 
else { echo("some false."); } 

तकनीकी तौर पर इस बात के लिए परीक्षण नहीं होता है "कुछ झूठे," इसके लिए परीक्षण लेकिन ऐसा लगता है जैसे आप निश्चित रूप से सुनिश्चित हैं कि आपको प्राप्त होने वाले एकमात्र मूल्य 'सत्य' और 'झूठे' हैं।

-2
$x = 0; 
foreach ($allvalues as $a) { 
    if ($a != $checkvalue) { 
     $x = 1; 
    } 
} 

//then check against $x 
if ($x != 0) { 
    //not all values are the same 
} 
9

अपने सरणी तार के बजाय वास्तविक बूलियन्स (या ints) शामिल हैं, तो आप array_sum इस्तेमाल कर सकते हैं:

$allvalues = array(TRUE, TRUE, TRUE); 
if(array_sum($allvalues) == count($allvalues)) { 
    echo 'all true'; 
} else { 
    echo 'some false'; 
} 

http://codepad.org/FIgomd9X

यह काम करता है क्योंकि TRUE1 के रूप में मूल्यांकन किया जाएगा, और FALSE0 के रूप में।

0

एक अन्य विकल्प:

function same($arr) { 
    return $arr === array_filter($arr, function ($element) use ($arr) { 
     return ($element === $arr[0]); 
    }); 
} 

उपयोग:

same(array(true, true, true)); // => true 
5

क्यों न सिर्फ array_unique() बुला के बाद गिनती की तुलना? यदि एक सरणी में सभी तत्वों को एक ही है

जाँच करने के लिए, के रूप में आसान होना चाहिए के रूप में:

$allValuesAreTheSame = (count(array_unique($allvalues)) === 1); 

इस सरणी में मानों के प्रकार की परवाह किए बिना काम करना चाहिए।

+0

क्योंकि "(array_unique गिनती" रिटर्न 1 – Andrew

+0

'1' तभी इनपुट सरणी में केवल एक अद्वितीय मूल्य है लौटा दी जाएगी।' Array_unique() 'समारोह" लेता है एक इनपुट सरणी और डुप्लिकेट मानों के बिना एक नया सरणी देता है। " – Werner

+0

नहीं, 1 सरणी में सभी मान समान हैं, तो 1 वापस कर दिया जाएगा। अगर मेरे पास सरणी (5,5,5) है, तो यह सरणी (5) और तुलना करेगा असफल हो जाएगा। आपका कोड गलत परिणाम उत्पन्न करता है। – Andrew

6

इसके अलावा, आप स्थिति में बकरी का जवाब गाढ़ा कर सकते हैं यह एक द्विआधारी नहीं है:

if (count(array_unique($allvalues)) === 1 && end($allvalues) === 'true') { 
    // ... 
} 

को
if (array_unique($allvalues) === array('foobar')) { 
    // all values in array are "foobar" 
} 
1

आप न्यूनतम और अधिकतम ... नहीं सबसे तेज़ तरीका तुलना कर सकते हैं, पी

$homogenous = (min($array) === max($array)); 
संबंधित मुद्दे