जाँच रहा है कि सभी सरणी आइटम खाली PHP हैं


83

मैं एक फॉर्म से कई मदों को जोड़ रहा हूं और यदि वे सभी खाली हैं, तो मैं कुछ सत्यापन करना चाहता हूं और त्रुटि स्ट्रिंग में जोड़ना चाहता हूं। तो मेरे पास है:

$array = array(
    'RequestID'       => $_POST["RequestID"],
    'ClientName'      => $_POST["ClientName"],
    'Username'        => $_POST["Username"],
    'RequestAssignee' => $_POST["RequestAssignee"],
    'Status'          => $_POST["Status"],
    'Priority'        => $_POST["Priority"]
);

और फिर अगर सभी सरणी तत्व खाली प्रदर्शन करते हैं:

$error_str .= '<li>Please enter a value into at least one of the fields regarding the request you are searching for.</li>';

5
इसे पढ़ने वाले किसी भी व्यक्ति के लिए, एकल उद्धरणों में $ _POST को संलग्न न करें - इसका मूल्यांकन नहीं किया जाएगा!
जेमी

2
मैंने उद्धरणों को संपादित करने की स्वतंत्रता ली।
xtofl

जवाबों:


177

आप सिर्फ array_filter में बिल्ट का उपयोग कर सकते हैं

यदि कोई कॉलबैक आपूर्ति नहीं की जाती है, तो FALSE (बूलियन में कनवर्ट करना) के बराबर इनपुट की सभी प्रविष्टियां हटा दी जाएंगी।

तो यह एक सरल रेखा में कर सकते हैं।

if(!array_filter($array)) {
    echo '<li>Please enter a value into at least one of the fields regarding the request you are searching for.</li>';
}

1
मैं यह जानने के लिए उत्सुक हूं कि क्या यह मेरे द्वारा सुझाए गए प्रत्यारोपण विधि से तेज है। चारों ओर कोई बेंचमार्क?
कैप्सूल

array_filter()@ dogmatic69 द्वारा पहले ही उल्लेख किया गया था। प्रदर्शन के बारे में - मेरा मानना ​​है कि सरल foreachको दोनों की तुलना में तेज होना चाहिए array_filter()और implode()
बाइनरीएलवी

यहाँ फ़ंक्शन phpbench.com में निर्मित php बेंचमार्क के लिए एक बढ़िया दृश्य है, लेकिन संभवतः यह सरणी के आकार पर निर्भर करेगा। यह विधि जितनी बड़ी होगी उतनी ही तेज़ गति होगी।
xzyfer

1
@ xzyfer, if(implode($array)) echo '..'प्रिंट होगा .. 'भले ही एक सरणी तत्व होगा (string)"0"foreachसे धीमी होने के बारे में array_filter()- क्या आपको यकीन है? कैसे सरणी तत्वों को हटा रहा है एक-एक करके सिर्फ पढ़ने वाले तत्वों की तुलना में तेजी से?
बाइनरीएलवी

2
@xzyfer, मैंने कुछ परीक्षण किए - array_filter()यदि कोई मान भरा है तो जाँचने के लिए , मूल परिणाम की तुलना में मूल लूप की तुलना में कम से कम कुछ गुना धीमा है, foreachपरिणाम के लिए और breakपहले अमान्य मान पर। यहां तक ​​कि array_filter()"मूल PHP फ़ंक्शन" होने के साथ , यह वास्तव में तेजी से नहीं हो सकता है foreachक्योंकि इसे नए सरणी चर बनाने के लिए है।
बाइनरीएलवी

22

खाली गोंद के साथ सरणी को फंसाएं और परिणामी स्ट्रिंग के आकार की जांच करें:

<?php if (strlen(implode($array)) == 0) echo 'all values of $array are empty'; ?>

आप strlenइसे और अधिक कुशल बनाने के लिए कॉल हटा सकते हैं । if(implode($array)) echo '..'
xzyfer

@binaryLV, कैसे? सहमत वे दोनों समस्या को हल करने में विफल रहते हैं। लेकिन वे असमान हैं कि वे नहीं हैं?
xzyfer

1
@xzyfer, यदि $strहै (string)'0', तो इसका strlen($str) == 0मूल्यांकन करता है false, जबकि बाहर !$strनिकालता है true, इसलिए strlen($str) == 0इसके साथ प्रतिस्थापित नहीं किया जा सकता है !$str
बाइनरीएलवी

यह समाधान उपयोग करने के लिए अधिक सही लगता है array_filter, क्योंकि array_filterएक कॉलबैक के साथ उपयोग करने का इरादा है, आप जानते हैं, एक सरणी को फ़िल्टर करने के लिए । लेकिन तुम सब करना चाहते हैं 'शून्यता' के लिए जाँच करें। तो आप इसकी एक स्ट्रिंग बनाते हैं और इसकी लंबाई की जांच करते हैं। प्रतिभाशाली।
कासिमिर

2
@kasimir की कॉलबैक फ़ंक्शन array_filterवैकल्पिक है और मैनुअल स्पष्ट रूप से बताता है कि यदि कोई कॉलबैक की आपूर्ति नहीं की गई है, तो FALSE (बूलियन में कनवर्ट करना देखें) के बराबर इनपुट की सभी प्रविष्टियों को हटा दिया जाएगा। तो, array_filterइस से कम सही नहीं है, यह सिर्फ एक अलग विधि है ;-)
कैप्सूल

7

एक पुराना सवाल, लेकिन मुझे लगा कि मैं अपने समाधान में पॉप करूंगा क्योंकि यह ऊपर सूचीबद्ध नहीं किया गया है।

function isArrayEmpty($array) {
    foreach($array as $key => $val) {
        if ($val !== '')
            return false;
    }
    return true;
}

1
empty()गलत-सकारात्मक परिणाम प्रदान कर सकते हैं। फ़ंक्शन falseyमानों को कैसे व्यवहार करता है, इसके बारे में मैनुअल देखें । मैं strlen()इसके बजाय कॉल की सिफारिश करूंगा ।
मिकमैकुसा

फाल्सीनेस @ मिकमैकुसा के बारे में रिमाइंडर के लिए धन्यवाद, मैंने इसे खाली स्ट्रिंग के लिए एक्सप्लिसिटी चेक में अपडेट किया है।
मुलक्विन

2

आपको वास्तव में इसकी आवश्यकता नहीं है।
आप इन क्षेत्रों को अलग से सत्यापित करने जा रहे हैं और इस प्रक्रिया को समाप्त करके आप बता सकते हैं कि क्या सरणी खाली थी (या इसमें अमान्य मान हैं, जो समान है)


दिलचस्प है! मुझे आश्चर्य है कि यह सरणी को फंसाने की तुलना में तेज़ है।
कैप्सूल

2
@ आकार 6 के सरणी के लिए, आप कभी भी मामूली अंतर नहीं देखेंगे, यहां तक ​​कि आप अपना पूरा जीवन चेकिंग ऐरे खर्च करते हैं। 1000 से अधिक आकारों के लिए मैं ऐरे का उपयोग न करने का सुझाव दूंगा।
आपका कॉमन सेंस

चूंकि हम वेबसाइटों के बारे में बात कर रहे हैं, आपको अपने आगंतुकों की संख्या के अनुसार गुणा करना होगा। 10 की एक सरणी की गणना करने वाले 1000 या 100 आगंतुकों की एक सूची CPU लागत की अवधि में समान है। आप सरणियों का उपयोग बंद करने का निर्णय नहीं ले सकते क्योंकि आपकी वेबसाइट कुछ लोकप्रियता हासिल कर रही है ;-)
कैप्सूल

2

इस तरह से उपयोग को आसान बनाएं:

$array = []; //target array
$is_empty = true; //flag

foreach ($array as $key => $value) {
    if ($value != '')
        $is_empty = false;
}
if ($is_empty)
    echo 'array is empty!';
else
    echo 'array is not empty!';

0

$ सरणी की आपकी परिभाषा गलत है और इसमें एकल उद्धरण हैं। इसे पढ़ना चाहिए:

$array = array( 'RequestID' =>  $_POST["RequestID"],
                'ClientName' => $_POST["ClientName"],
                'Username' => $_POST["Username"],
                'RequestAssignee' => $_POST["RequestAssignee"],
                'Status' => $_POST["Status"],
                'Priority' => $_POST["Priority"] );

3
आप या तो उपयोग कर सकते हैं। दोहरे उद्धरण वास्तव में थोड़े धीमे हैं।
आरोन हारुन

@AaronHarun प्रश्न के मूल संस्करण को देखें, जिसमें अजीब गलत उद्धरण थे। उस ने कहा, यह सही है, लेकिन वास्तव में सवाल का जवाब देने का प्रयास नहीं करता है।
टीआरजी

-1

मेरे पास एक ही सवाल था, लेकिन सरणी में प्रत्येक तत्व को अलग से देखना चाहता था कि कौन सा खाली था। यह अपेक्षा से अधिक कठिन था क्योंकि आपको खाली सरणी तत्व की जांच करने और प्रतिक्रिया देने के लिए अलग-अलग सरणियों में महत्वपूर्ण मान और वास्तविक मान बनाने की आवश्यकता थी।

print_r($requestDecoded);
$arrayValues = array_values($requestDecoded);  //Create array of values
$arrayKeys = array_keys($requestDecoded);      //Create array of keys to count
$count = count($arrayKeys);
for($i = 0; $i < $count; $i++){  
    if ( empty ($arrayValues[$i] ) ) {         //Check which value is empty
        echo $arrayKeys[$i]. " can't be empty.\r\n";
    } 
}

परिणाम:

Array
(
    [PONumber] => F12345
    [CompanyName] => Test
    [CompanyNum] => 222222
    [ProductName] => Test
    [Quantity] =>
    [Manufacturer] => Test
)

मात्रा खाली नहीं हो सकती।


क्या? बस का उपयोग करें foreach($array as $key => $value)और परीक्षण अगर $valueखाली नहीं है।
कैप्सूल

-2

नहीं थक गए लेकिन आप तर्क प्राप्त करें :)

$error = 0;
foreach ($array as $k => $v){
    if (empty($v)) {
        $error++;
    }
}

if ($error == count($array)) {
    $error_str .= '<li>Please enter a value into at least one of the fields regarding the request you are searching for.</li>';
}

2
(मेरे नीच नहीं, लेकिन ...) यह केवल एक स्थिर / विश्वसनीय दृष्टिकोण नहीं है। 3v4l.org/g3Jf6 कृपया इस उत्तर को हटा दें ताकि आप पाठकों को भ्रमित न करें या बदतर - उन्हें एक बुरी विधि का उपयोग करने के लिए प्रोत्साहित करें।
मिकमैकुसा

-4

यह बहुत आसान है:

foreach($array as $k => $v)
{
    if(empty($v))
    {
        unset($array[$k]);
    }
}
$show_error = count($array) == 0;

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


उसे नंबर की जरूरत नहीं है। बस 1 पर्याप्त है
आपका कॉमन सेंस

क्या?, वह जानना चाहता था कि क्या सभी तत्व खाली हैं, बस एक बूलियन की कोई संख्या नहीं है
रॉबर्टपिट

मुझे लगता है कि Col. crassly क्या कह रहा है कि दोनों PHP में हैं count($array) == 0और count($array)सच का मूल्यांकन करते हैं ताकि अतिरिक्त तुलना और असाइनमेंट चरण अनावश्यक रूप से खराब हो। यद्यपि असाइनमेंट की लागत php में बहुत कम है।
xzyfer

आह, यह वास्तव में बहुत बड़ा अंतर नहीं है, लेकिन मैं बूलियन के अधिकांश समय के साथ काम करूंगा, मुझे नहीं लगता कि नीचे वोट क्यों, हालांकि, यह एक काम करने का तरीका है और उसे आवश्यक परिणाम बनाता है।
राबर्टपिट

यह कहना कि कोई सरणी खाली है या नहीं, यह केवल एक भरे हुए तत्व को खोजने के लिए पर्याप्त है। इसे लोगिक कहा जाता है।
आपका कॉमन सेंस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.