PHP में कोई ऑब्जेक्ट खाली है या नहीं, कैसे पता करें।
निम्नलिखित कोड है जिसमें $obj
XML डेटा को रखा गया है। अगर यह खाली है या नहीं तो मैं कैसे जांच सकता हूं?
मेरा कोड:
$obj = simplexml_load_file($url);
PHP में कोई ऑब्जेक्ट खाली है या नहीं, कैसे पता करें।
निम्नलिखित कोड है जिसमें $obj
XML डेटा को रखा गया है। अगर यह खाली है या नहीं तो मैं कैसे जांच सकता हूं?
मेरा कोड:
$obj = simplexml_load_file($url);
जवाबों:
आप किसी ऐरे में जा सकते हैं और फिर चेक कर सकते हैं कि वह खाली है या नहीं
$arr = (array)$obj;
if (!$arr) {
// do stuff
}
empty($var)
उसके बराबर है (!isset($var) || !$var)
। आप अपने empty($arr)
एस को !$arr
तब से बदल सकते हैंarray() == FALSE
empty((array) $obj)
PHP 5.4+ में काम नहीं करने का कारण एक लाइन पर टाइपकास्टिंग से कोई लेना-देना नहीं है। आप त्रुटि प्राप्त करते हैं क्योंकि empty()
इसमें पारित चर का संदर्भ लिया जाता है, और जब तक आप पहली बार उस टाइप किए गए चर को दूसरे चर में संग्रहीत नहीं करते हैं तब तक टाइपकास्टिंग करते समय इसे संदर्भ नहीं मिल सकता है। यह मेरी पिछली टिप्पणी में वर्णित के कारण ऐसा करता है। बल्कि यह निराशाजनक है कि यह स्वीकृत उत्तर है क्योंकि यह लोगों को यह विश्वास दिलाने के लिए नेतृत्व कर सकता है कि empty()
क्या कोई सरणी "खाली" है जो कि सच नहीं है - यह वास्तव में जो करता है उसका केवल एक पक्ष प्रभाव है।
संपादित करें : मुझे एहसास नहीं हुआ कि वे विशेष रूप से जांचना चाहते हैं कि क्या एक 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
PHP Warning: Uncaught Error: Call to undefined method stdClass::count()
->count()
विशेषकर के उदाहरणों के लिए है, SimpleXMLElement
न कि उदाहरणों के लिए stdClass
। मेरा मानना है कि यह सब अभी भी PHP7.2 में काम करता है।
आप अपनी वस्तु को एक सरणी में रख सकते हैं, और इसकी गणना को इस तरह से परख सकते हैं:
if(count((array)$obj)) {
// doStuff
}
कल्पना करें कि यदि वस्तु खाली नहीं है और एक तरह से काफी बड़ी है, तो आप संसाधनों को बेकार में डालने के लिए उसे बेकार कर देंगे या उसे अनुक्रमित कर देंगे ...
यह एक बहुत ही आसान समाधान है जिसका मैं जावास्क्रिप्ट में उपयोग करता हूं। उल्लिखित समाधान के विपरीत, जो ऑब्जेक्ट को सरणी में रखता है और जांचता है कि क्या यह खाली है, या इसे JSON में एन्कोड करने के लिए, यह सरल फ़ंक्शन एक सरल कार्य करने के लिए उपयोग किए गए संसाधनों से संबंधित बहुत कुशल है।
function emptyObj( $obj ) {
foreach ( $obj AS $prop ) {
return FALSE;
}
return TRUE;
}
समाधान बहुत सरल तरीके से काम करता है: यह अभ्यस्त लूप में एक लूप दर्ज करता है यदि ऑब्जेक्ट खाली है और यह वापस आ जाएगा true
। यदि यह खाली नहीं है तो यह foreach
लूप में प्रवेश करेगा और false
पूरे सेट से गुजरते हुए, तुरंत वापस नहीं लौटेगा ।
का उपयोग करते हुए empty()
जब यह एक वस्तु पर का उपयोग कर, क्योंकि हमेशा की तरह काम नहीं करेगा __isset()
ओवरलोडिंग विधि, बजाय बुलाया जाएगा अगर घोषित कर दिया।
इसलिए आप उपयोग कर सकते हैं count()
(यदि ऑब्जेक्ट काउंटेबल है )।
या का उपयोग करके get_object_vars()
, जैसे
get_object_vars($obj) ? TRUE : FALSE;
एक और संभावित समाधान जिसे कास्टिंग की आवश्यकता नहीं है 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 ) );
यदि कोई वस्तु खाली है, तो जांचने का कोई अनूठा सुरक्षित तरीका नहीं है
php की गिनती () पहले सरणी के लिए जाती है, लेकिन कास्टिंग एक खाली सरणी का उत्पादन कर सकती है, यह निर्भर करता है कि ऑब्जेक्ट कैसे लागू किया जाता है (एक्सटेंशन की वस्तुएं अक्सर उन मुद्दों से प्रभावित होती हैं)
आपके मामले में आपको $ obj-> count () का उपयोग करना होगा;
http://it.php.net/manual/en/simplexmlelement.count.php
(यह php की गिनती नहीं है http://www.php.net/count )
यदि आप 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!";
}
यदि कोई वस्तु "रिक्त" है या नहीं, यह परिभाषा का विषय है, और क्योंकि यह उस वस्तु की प्रकृति पर निर्भर करता है जो कक्षा का प्रतिनिधित्व करती है, यह वर्ग को परिभाषित करने के लिए है।
PHP अपने आप में वर्ग के हर उदाहरण को खाली नहीं मानता है।
class Test { }
$t = new Test();
var_dump(empty($t));
// results in bool(false)
"रिक्त" ऑब्जेक्ट के लिए कोई सामान्य परिभाषा नहीं हो सकती है। आप उपरोक्त उदाहरण में तर्क दे सकते हैं कि परिणाम कैसा empty()
होना चाहिए true
, क्योंकि ऑब्जेक्ट किसी भी सामग्री का प्रतिनिधित्व नहीं करता है। लेकिन PHP कैसे पता है? कुछ वस्तुएं कभी भी सामग्री का प्रतिनिधित्व करने के लिए नहीं होती हैं (उदाहरण के लिए कारखानों पर विचार करें), अन्य हमेशा एक सार्थक मूल्य (विचार new DateTime()
) का प्रतिनिधित्व करते हैं ।
संक्षेप में, आपको किसी विशिष्ट वस्तु के लिए अपने स्वयं के मानदंड के साथ आना होगा, और उनके अनुसार परीक्षण करना होगा, या तो वस्तु के बाहर से या वस्तु में स्व-लिखित isEmpty()
विधि से।
$array = array_filter($array);
if(!empty($array)) {
echo "not empty";
}
या
if(count($array) > 0) {
echo 'Error';
} else {
echo 'No Error';
}
मैं पोस्ट अनुरोध में एक स्ट्रिंग के json_d timecode का उपयोग कर रहा था। उपरोक्त में से कोई भी मेरे लिए काम नहीं करता था, अंत में मैंने इसका इस्तेमाल किया:
$post_vals = json_decode($_POST['stuff']);
if(json_encode($post_vals->object) != '{}')
{
// its not empty
}