পিএইচপি-তে কোনও অবজেক্ট খালি আছে কিনা তা কীভাবে সন্ধান করবেন।
$objXML ডেটা ধারণ করে এমন কোডটি নীচে দেওয়া হয়েছে । এটি খালি কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?
আমার কোড:
$obj = simplexml_load_file($url);
পিএইচপি-তে কোনও অবজেক্ট খালি আছে কিনা তা কীভাবে সন্ধান করবেন।
$objXML ডেটা ধারণ করে এমন কোডটি নীচে দেওয়া হয়েছে । এটি খালি কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?
আমার কোড:
$obj = simplexml_load_file($url);
উত্তর:
আপনি একটি অ্যারেতে কাস্ট করতে পারেন এবং তারপরে এটি খালি কিনা তা যাচাই করতে পারেন
$arr = (array)$obj;
if (!$arr) {
// do stuff
}
empty($var)সমতুল্য তা পরীক্ষা করে না (!isset($var) || !$var)। আপনি যেহেতু empty($arr)এর সাথে প্রতিস্থাপন করতে পারেন!$arrarray() == FALSE
empty((array) $obj)পিএইচপি 5.4+ এ কাজ করে না কারণ এক লাইনে টাইপকাস্টিংয়ের সাথে কোনও সম্পর্ক নেই। আপনি ত্রুটিটি পেয়েছেন কারণ এতে empty()পাস হওয়া ভেরিয়েবলগুলির একটি রেফারেন্স নেয় এবং এটি টাইপকাস্ট করার সময় কোনও রেফারেন্স পেতে পারে না যদি আপনি প্রথমে সেই টাইপকাষ্ট ভেরিয়েবলটিকে অন্য কোনও ভেরিয়েবলের মধ্যে সঞ্চয় না করেন। আমি আমার আগের মন্তব্যে যা বর্ণনা করেছি তার কারণেই এটি এটি করে। এটি বরং হতাশার কারণ এটি গ্রহণযোগ্য উত্তর কারণ এটি লোকেরা বিশ্বাস করতে পারে যে empty()কোনও অ্যারে "খালি" যা সত্য নয় তা যাচাই করে - এটি আসলে যা করে তা কেবলমাত্র তার পার্শ্ব প্রতিক্রিয়া।
সম্পাদনা : আমি বুঝতে পারিনি যে তারা সিম্পল এক্সএমলেমেন্ট উপাদানটি খালি কিনা তা বিশেষভাবে পরীক্ষা করতে চেয়েছিলেন। আমি নীচে পুরানো উত্তর ছেড়ে
সিম্পল এক্সএমলেমেন্টের জন্য:
যদি খালি দ্বারা আপনার মানে কোনও বৈশিষ্ট্য নেই:
$obj = simplexml_load_file($url);
if ( !$obj->count() )
{
// no properties
}
অথবা
$obj = simplexml_load_file($url);
if ( !(array)$obj )
{
// empty array
}
যদি সিম্পল এক্সএমলেমেন্ট এক স্তর গভীর হয় এবং খালি দ্বারা আপনি প্রকৃতপক্ষে বোঝাতে চান যে এটির কেবলমাত্র বৈশিষ্ট্য রয়েছে পিএইচপি মিথ্যা (বা কোনও বৈশিষ্ট্য নয়) বিবেচনা করে:
$obj = simplexml_load_file($url);
if ( !array_filter((array)$obj) )
{
// all properties falsey or no properties at all
}
যদি সিম্পল এক্সএমলেমেন্ট এক স্তরের বেশি গভীর হয় তবে আপনি এটি খাঁটি অ্যারেতে রূপান্তর করে শুরু করতে পারেন:
$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-compistance.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। আমি বিশ্বাস করি এইগুলি এখনও পিএইচপি 7.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 ) );
কোনও বিষয় খালি আছে কিনা তা পরীক্ষা করার কোনও অনন্য নিরাপদ উপায় নেই
পিএইচপি এর গণনা () অ্যারেতে প্রথম কাস্ট করে তবে কাস্টিং একটি খালি অ্যারে তৈরি করতে পারে, কীভাবে অবজেক্টটি প্রয়োগ করা হয় তার উপর নির্ভর করে (এক্সটেনশানগুলির অবজেক্টগুলি প্রায়শই সেই সমস্যাগুলির দ্বারা প্রভাবিত হয়)
আপনার ক্ষেত্রে আপনাকে $ obj-> গণনা () ব্যবহার করতে হবে;
http://it.php.net/manual/en/simplexmlelement.count.php
(এটি পিএইচপি এর গণনা নয় http://www.php.net/count )
যদি আপনি পিএইচপি-তে কোনও কিছু (কুল) হিসাবে ফেলে দেন তবে আইটেমটি কোনও বস্তু, আদিম ধরণের বা নাল হলে তা অবিলম্বে আপনাকে জানায়। নিম্নলিখিত কোড ব্যবহার করুন:
$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!";
}
যদি কোনও বস্তু "শূন্য" হয় বা হয় না তবে এটি সংজ্ঞার বিষয়, এবং যেহেতু এটি শ্রেণীর প্রতিনিধিত্ব করে এমন বস্তুর প্রকৃতির উপর নির্ভর করে, এটি শ্রেণীর সংজ্ঞা দেবার জন্য।
পিএইচপি নিজেই ক্লাসের প্রতিটি ঘটনাকে শূন্য নয় বলে বিবেচনা করে।
class Test { }
$t = new Test();
var_dump(empty($t));
// results in bool(false)
"খালি" বস্তুর জন্য জেনেরিক সংজ্ঞা থাকতে পারে না। আপনি উপরের উদাহরণে তর্ক করতে পারেন এর ফলাফলটি হওয়া empty()উচিত true, কারণ বস্তুটি কোনও সামগ্রীকে উপস্থাপন করে না। তবে পিএইচপি কীভাবে জানতে হবে? কিছু বস্তু কখনই সামগ্রীর প্রতিনিধিত্ব করতে বোঝায় না (উদাহরণস্বরূপ কলকারখানাগুলি), অন্যরা সর্বদা অর্থবোধক মূল্য উপস্থাপন করে (ভাবেন new DateTime())।
সংক্ষেপে, আপনাকে একটি নির্দিষ্ট অবজেক্টের জন্য নিজস্ব মানদণ্ড নিয়ে আসতে হবে এবং সে অনুযায়ী এটি পরীক্ষা করতে হবে, হয় বস্তুর বাইরে থেকে বা কোনও স্ব-লিখিত isEmpty()পদ্ধতি থেকে।
$array = array_filter($array);
if(!empty($array)) {
echo "not empty";
}
অথবা
if(count($array) > 0) {
echo 'Error';
} else {
echo 'No Error';
}
আমি পোস্টের অনুরোধে একটি স্ট্রিংয়ের একটি json_decode ব্যবহার করছিলাম। উপরের কোনওটিই আমার পক্ষে কাজ করেনি, শেষ পর্যন্ত আমি এটি ব্যবহার করেছি:
$post_vals = json_decode($_POST['stuff']);
if(json_encode($post_vals->object) != '{}')
{
// its not empty
}