यह कैसे जांचें कि PHP में कोई ऑब्जेक्ट खाली है?


104

PHP में कोई ऑब्जेक्ट खाली है या नहीं, कैसे पता करें।

निम्नलिखित कोड है जिसमें $objXML डेटा को रखा गया है। अगर यह खाली है या नहीं तो मैं कैसे जांच सकता हूं?

मेरा कोड:

$obj = simplexml_load_file($url);


जवाबों:


130

आप किसी ऐरे में जा सकते हैं और फिर चेक कर सकते हैं कि वह खाली है या नहीं

$arr = (array)$obj;
if (!$arr) {
    // do stuff
}

9
टाइपकास्टिंग मेरे लिए काम नहीं करता है, क्योंकि मुझे त्रुटि मिलती है: PHP पार्स त्रुटि: सिंटैक्स त्रुटि, अप्रत्याशित '(सरणी)' (सरणी) (T_ARRAY_CAST) ... मैं PHP संस्करण 5.4.28 का उपयोग करता हूं और इसके साथ पहला विकल्प कोड की दो लाइनें मेरे लिए काम करती हैं।
Coanda

WordPress प्लगइन अपलोड करते समय एक ही त्रुटि थी, ऐसा लगता है कि वे PHP के पुराने संस्करण का भी उपयोग करते हैं।
आसफ

4
खाली वास्तव में जाँच नहीं करता है कि कोई सरणी खाली है, empty($var)उसके बराबर है (!isset($var) || !$var)। आप अपने empty($arr)एस को !$arrतब से बदल सकते हैंarray() == FALSE
टिमोथी ज़ोर्न

2
empty((array) $obj)PHP 5.4+ में काम नहीं करने का कारण एक लाइन पर टाइपकास्टिंग से कोई लेना-देना नहीं है। आप त्रुटि प्राप्त करते हैं क्योंकि empty()इसमें पारित चर का संदर्भ लिया जाता है, और जब तक आप पहली बार उस टाइप किए गए चर को दूसरे चर में संग्रहीत नहीं करते हैं तब तक टाइपकास्टिंग करते समय इसे संदर्भ नहीं मिल सकता है। यह मेरी पिछली टिप्पणी में वर्णित के कारण ऐसा करता है। बल्कि यह निराशाजनक है कि यह स्वीकृत उत्तर है क्योंकि यह लोगों को यह विश्वास दिलाने के लिए नेतृत्व कर सकता है कि empty()क्या कोई सरणी "खाली" है जो कि सच नहीं है - यह वास्तव में जो करता है उसका केवल एक पक्ष प्रभाव है।
टिमोथी जोर्न

क्या यह php 7+ में काम करेगा, या क्या इसे ठीक करने का सही तरीका है।
कांतसवर्मा

32

संपादित करें : मुझे एहसास नहीं हुआ कि वे विशेष रूप से जांचना चाहते हैं कि क्या एक SimpleXMLElement ऑब्जेक्ट खाली है। मैंने नीचे पुराना उत्तर छोड़ दिया

अपडेट किया गया उत्तर (SimpleXMLElement) :

SimpleXMLElement के लिए:

यदि खाली होने से आप का कोई मतलब नहीं है:

$obj = simplexml_load_file($url);
if ( !$obj->count() )
{
    // no properties
}

या

$obj = simplexml_load_file($url);
if ( !(array)$obj )
{
    // empty array
}

यदि SimpleXMLElement एक स्तर गहरा है, और खाली होने से आप वास्तव में इसका मतलब है कि यह केवल गुण है PHP मानता है (या अन्य गुण:

$obj = simplexml_load_file($url);
if ( !array_filter((array)$obj) )
{
    // all properties falsey or no properties at all
}

यदि SimpleXMLElement एक स्तर से अधिक गहरा है, तो आप इसे शुद्ध सरणी में परिवर्तित करके शुरू कर सकते हैं:

$obj = simplexml_load_file($url);
// `json_decode(json_encode($obj), TRUE)` can be slow because
// you're converting to and from a JSON string.
// I don't know another simple way to do a deep conversion from object to array
$array = json_decode(json_encode($obj), TRUE);
if ( !array_filter($array) )
{
    // empty or all properties falsey
}


पुराना उत्तर (सरल वस्तु) :

यदि आप जांचना चाहते हैं कि क्या एक साधारण वस्तु (प्रकार stdClass) पूरी तरह से खाली है (कोई कुंजी / मान नहीं), तो आप निम्न कार्य कर सकते हैं:

// $obj is type stdClass and we want to check if it's empty
if ( $obj == new stdClass() )
{
    echo "Object is empty"; // JSON: {}
}
else
{
    echo "Object has properties";
}

स्रोत: http://php.net/manual/en/language.oop5.object-comparison.php

संपादित करें : जोड़ा गया उदाहरण

$one = new stdClass();
$two = (object)array();

var_dump($one == new stdClass()); // TRUE
var_dump($two == new stdClass()); // TRUE
var_dump($one == $two); // TRUE

$two->test = TRUE;
var_dump($two == new stdClass()); // FALSE
var_dump($one == $two); // FALSE

$two->test = FALSE;
var_dump($one == $two); // FALSE

$two->test = NULL;
var_dump($one == $two); // FALSE

$two->test = TRUE;
$one->test = TRUE;
var_dump($one == $two); // TRUE

unset($one->test, $two->test);
var_dump($one == $two); // TRUE

PHP7.2 में काम नहीं करता है:PHP Warning: Uncaught Error: Call to undefined method stdClass::count()
Juha Untinen

2
@ जुहा-अनहोनी का समाधान ->count()विशेषकर के उदाहरणों के लिए है, SimpleXMLElementन कि उदाहरणों के लिए stdClass। मेरा मानना ​​है कि यह सब अभी भी PHP7.2 में काम करता है।
तीमुथियुस

21

आप अपनी वस्तु को एक सरणी में रख सकते हैं, और इसकी गणना को इस तरह से परख सकते हैं:

if(count((array)$obj)) {
   // doStuff
}

12

कल्पना करें कि यदि वस्तु खाली नहीं है और एक तरह से काफी बड़ी है, तो आप संसाधनों को बेकार में डालने के लिए उसे बेकार कर देंगे या उसे अनुक्रमित कर देंगे ...

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

function emptyObj( $obj ) {
    foreach ( $obj AS $prop ) {
        return FALSE;
    }

    return TRUE;
}

समाधान बहुत सरल तरीके से काम करता है: यह अभ्यस्त लूप में एक लूप दर्ज करता है यदि ऑब्जेक्ट खाली है और यह वापस आ जाएगा true। यदि यह खाली नहीं है तो यह foreachलूप में प्रवेश करेगा और falseपूरे सेट से गुजरते हुए, तुरंत वापस नहीं लौटेगा ।


8

का उपयोग करते हुए empty()जब यह एक वस्तु पर का उपयोग कर, क्योंकि हमेशा की तरह काम नहीं करेगा __isset()ओवरलोडिंग विधि, बजाय बुलाया जाएगा अगर घोषित कर दिया।

इसलिए आप उपयोग कर सकते हैं count()(यदि ऑब्जेक्ट काउंटेबल है )।

या का उपयोग करके get_object_vars(), जैसे

get_object_vars($obj) ? TRUE : FALSE;

7

एक और संभावित समाधान जिसे कास्टिंग की आवश्यकता नहीं है array:

// test setup
class X { private $p = 1; } // private fields only => empty
$obj = new X;
// $obj->x = 1;


// test wrapped into a function
function object_empty( $obj ){
  foreach( $obj as $x ) return false;
  return true;
}


// inline test
$object_empty = true;
foreach( $obj as $object_empty ){ // value ignored ... 
  $object_empty = false; // ... because we set it false
  break;
}


// test    
var_dump( $object_empty, object_empty( $obj ) );

2

यदि कोई वस्तु खाली है, तो जांचने का कोई अनूठा सुरक्षित तरीका नहीं है

php की गिनती () पहले सरणी के लिए जाती है, लेकिन कास्टिंग एक खाली सरणी का उत्पादन कर सकती है, यह निर्भर करता है कि ऑब्जेक्ट कैसे लागू किया जाता है (एक्सटेंशन की वस्तुएं अक्सर उन मुद्दों से प्रभावित होती हैं)

आपके मामले में आपको $ obj-> count () का उपयोग करना होगा;

http://it.php.net/manual/en/simplexmlelement.count.php

(यह php की गिनती नहीं है http://www.php.net/count )


1

यदि आप PHP में एक (बूल) के रूप में कुछ भी डालते हैं, तो यह आपको तुरंत बताएगा कि क्या वस्तु एक वस्तु, आदिम प्रकार या अशक्त है। निम्नलिखित कोड का उपयोग करें:

$obj = simplexml_load_file($url);

if (!(bool)$obj) {
    print "This variable is null, 0 or empty";
} else {
    print "Variable is an object or a primitive type!";
}

1
गलत। $ x = new \ stdClass (); var_dump ((bool) $ x); प्रिंट 'सच'; आपके मामले में, कुछ मामलों में सरल एक्सएमएलएम झूठी हो सकती है
क्लेमिस

सही बात। new stdClass () एक वैध वस्तु है, इसीलिए यह सच है। PHP मैनुअल कहता है, simplexml_load_file (), "XML Simple दस्तावेज़ में मौजूद डेटा या विफलता पर FALSE वाले गुणों के साथ वर्ग SimpleXMLElement की एक वस्तु लौटाता है।" इसलिए, यदि आप (बूल) simplexml_load_file () को कास्ट करते हैं, तो यह सही होगा (क्योंकि फंक्शन किसी ऑब्जेक्ट को लौटाता है) लेकिन गलत (क्योंकि फंक्शन गलत आया है)।
रूजवेल्ट

0

यदि कोई वस्तु "रिक्त" है या नहीं, यह परिभाषा का विषय है, और क्योंकि यह उस वस्तु की प्रकृति पर निर्भर करता है जो कक्षा का प्रतिनिधित्व करती है, यह वर्ग को परिभाषित करने के लिए है।

PHP अपने आप में वर्ग के हर उदाहरण को खाली नहीं मानता है।

class Test { }
$t = new Test();
var_dump(empty($t));

// results in bool(false)

"रिक्त" ऑब्जेक्ट के लिए कोई सामान्य परिभाषा नहीं हो सकती है। आप उपरोक्त उदाहरण में तर्क दे सकते हैं कि परिणाम कैसा empty()होना चाहिए true, क्योंकि ऑब्जेक्ट किसी भी सामग्री का प्रतिनिधित्व नहीं करता है। लेकिन PHP कैसे पता है? कुछ वस्तुएं कभी भी सामग्री का प्रतिनिधित्व करने के लिए नहीं होती हैं (उदाहरण के लिए कारखानों पर विचार करें), अन्य हमेशा एक सार्थक मूल्य (विचार new DateTime()) का प्रतिनिधित्व करते हैं ।

संक्षेप में, आपको किसी विशिष्ट वस्तु के लिए अपने स्वयं के मानदंड के साथ आना होगा, और उनके अनुसार परीक्षण करना होगा, या तो वस्तु के बाहर से या वस्तु में स्व-लिखित isEmpty()विधि से।


0
$array = array_filter($array);
if(!empty($array)) {
    echo "not empty";
}

या

if(count($array) > 0) {
    echo 'Error';
} else {
    echo 'No Error';
}

हालांकि यह इस सवाल का जवाब दे सकता है कि आप क्या कर रहे हैं, यह समझाने के लिए अपने उत्तर में कुछ पाठ डालना एक अच्छा विचार है। एक अच्छा उत्तर लिखने का तरीका पढ़ें ।
जॉर्जेन आर

-1

मैं पोस्ट अनुरोध में एक स्ट्रिंग के json_d timecode का उपयोग कर रहा था। उपरोक्त में से कोई भी मेरे लिए काम नहीं करता था, अंत में मैंने इसका इस्तेमाल किया:

$post_vals = json_decode($_POST['stuff']);

if(json_encode($post_vals->object) != '{}')
{
    // its not empty
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.