পিএইচপি-তে কোনও বস্তু খালি আছে কীভাবে তা পরীক্ষা করবেন?


104

পিএইচপি-তে কোনও অবজেক্ট খালি আছে কিনা তা কীভাবে সন্ধান করবেন।

$objXML ডেটা ধারণ করে এমন কোডটি নীচে দেওয়া হয়েছে । এটি খালি কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?

আমার কোড:

$obj = simplexml_load_file($url);


উত্তর:


130

আপনি একটি অ্যারেতে কাস্ট করতে পারেন এবং তারপরে এটি খালি কিনা তা যাচাই করতে পারেন

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

9
টাইপকাস্টিংটি আমার পক্ষে কাজ করে না, কারণ আমি ত্রুটিটি পেয়েছি: পিএইচপি পার্স ত্রুটি: সিনট্যাক্স ত্রুটি, অপ্রত্যাশিত '(অ্যারে)' (অ্যারে) (টি_আরআরে_সিএসটি) এতে ... আমি পিএইচপি সংস্করণ 5.4.28 এবং এর সাথে প্রথম বিকল্পটি ব্যবহার করি কোড দুটি লাইন আমার জন্য কাজ করে।
কোন্ডা

ওয়ার্ডপ্রেস প্লাগইন আপলোড করার সময় একই ত্রুটি ঘটেছে বলে মনে হয় তারা পিএইচপি এর একটি পুরানো সংস্করণ ব্যবহার করে।
আসফ

4
খালি আসলে কোন অ্যারে খালি, empty($var)সমতুল্য তা পরীক্ষা করে না (!isset($var) || !$var)। আপনি যেহেতু empty($arr)এর সাথে প্রতিস্থাপন করতে পারেন!$arrarray() == FALSE
টিমোথি জর্ন

2
empty((array) $obj)পিএইচপি 5.4+ এ কাজ করে না কারণ এক লাইনে টাইপকাস্টিংয়ের সাথে কোনও সম্পর্ক নেই। আপনি ত্রুটিটি পেয়েছেন কারণ এতে empty()পাস হওয়া ভেরিয়েবলগুলির একটি রেফারেন্স নেয় এবং এটি টাইপকাস্ট করার সময় কোনও রেফারেন্স পেতে পারে না যদি আপনি প্রথমে সেই টাইপকাষ্ট ভেরিয়েবলটিকে অন্য কোনও ভেরিয়েবলের মধ্যে সঞ্চয় না করেন। আমি আমার আগের মন্তব্যে যা বর্ণনা করেছি তার কারণেই এটি এটি করে। এটি বরং হতাশার কারণ এটি গ্রহণযোগ্য উত্তর কারণ এটি লোকেরা বিশ্বাস করতে পারে যে empty()কোনও অ্যারে "খালি" যা সত্য নয় তা যাচাই করে - এটি আসলে যা করে তা কেবলমাত্র তার পার্শ্ব প্রতিক্রিয়া।
টিমোথি জর্ন

এটি পিএইচপি 7+ এ কাজ করবে, বা এটি ঠিক করার সঠিক উপায়।
কান্টসভারমা

32

সম্পাদনা : আমি বুঝতে পারিনি যে তারা সিম্পল এক্সএমলেমেন্ট উপাদানটি খালি কিনা তা বিশেষভাবে পরীক্ষা করতে চেয়েছিলেন। আমি নীচে পুরানো উত্তর ছেড়ে

আপডেট করা উত্তর (সিম্পল এক্সএমলেট) :

সিম্পল এক্সএমলেমেন্টের জন্য:

যদি খালি দ্বারা আপনার মানে কোনও বৈশিষ্ট্য নেই:

$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

পিএইচপি 7.2 এ কাজ করে না:PHP Warning: Uncaught Error: Call to undefined method stdClass::count()
জুহা আনটিনেন

2
@ জুহা-আনটিনেন এর সমাধানটি ->count()বিশেষত উদাহরণগুলির জন্য SimpleXMLElementএবং উদাহরণের জন্য নয় stdClass। আমি বিশ্বাস করি এইগুলি এখনও পিএইচপি 7.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

কোনও বিষয় খালি আছে কিনা তা পরীক্ষা করার কোনও অনন্য নিরাপদ উপায় নেই

পিএইচপি এর গণনা () অ্যারেতে প্রথম কাস্ট করে তবে কাস্টিং একটি খালি অ্যারে তৈরি করতে পারে, কীভাবে অবজেক্টটি প্রয়োগ করা হয় তার উপর নির্ভর করে (এক্সটেনশানগুলির অবজেক্টগুলি প্রায়শই সেই সমস্যাগুলির দ্বারা প্রভাবিত হয়)

আপনার ক্ষেত্রে আপনাকে $ obj-> গণনা () ব্যবহার করতে হবে;

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

(এটি পিএইচপি এর গণনা নয় http://www.php.net/count )


1

যদি আপনি পিএইচপি-তে কোনও কিছু (কুল) হিসাবে ফেলে দেন তবে আইটেমটি কোনও বস্তু, আদিম ধরণের বা নাল হলে তা অবিলম্বে আপনাকে জানায়। নিম্নলিখিত কোড ব্যবহার করুন:

$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 = নতুন \ stdClass (); , var_dump ((bool,) $ x এর); প্রিন্ট 'সত্য'; আপনার ক্ষেত্রে, সিম্পল এক্সএমএল কিছু ক্ষেত্রে মিথ্যা প্রত্যাবর্তন করতে পারে
কুমেসিস

সঠিক। new stdClass () একটি বৈধ অবজেক্ট, এ কারণেই এটি সত্য। পিএইচপি ম্যানুয়াল, সরল xML_load_file () বলেছে, "এক্সএমএল ডকুমেন্টের মধ্যে থাকা ডেটা সম্বলিত বৈশিষ্ট্য সহ ব্যর্থ সিম্পলএক্সএলএমলেমেন্টের কোনও বস্তু বা ব্যর্থতার জন্য FALSE প্রদান করে" " সুতরাং, যদি আপনি (bool) সিম্পল এমএমএল_ লোড_ফায়াল () কাস্ট করেন তবে এটি সত্য হবে (কারণ ফাংশনটি কোনও বস্তু ফিরিয়ে দিয়েছে) তবে মিথ্যা (কারণ ফাংশনটি মিথ্যা বলে প্রত্যাবর্তন করেছে)।
রোজভেল্ট

0

যদি কোনও বস্তু "শূন্য" হয় বা হয় না তবে এটি সংজ্ঞার বিষয়, এবং যেহেতু এটি শ্রেণীর প্রতিনিধিত্ব করে এমন বস্তুর প্রকৃতির উপর নির্ভর করে, এটি শ্রেণীর সংজ্ঞা দেবার জন্য।

পিএইচপি নিজেই ক্লাসের প্রতিটি ঘটনাকে শূন্য নয় বলে বিবেচনা করে।

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

// results in bool(false)

"খালি" বস্তুর জন্য জেনেরিক সংজ্ঞা থাকতে পারে না। আপনি উপরের উদাহরণে তর্ক করতে পারেন এর ফলাফলটি হওয়া empty()উচিত true, কারণ বস্তুটি কোনও সামগ্রীকে উপস্থাপন করে না। তবে পিএইচপি কীভাবে জানতে হবে? কিছু বস্তু কখনই সামগ্রীর প্রতিনিধিত্ব করতে বোঝায় না (উদাহরণস্বরূপ কলকারখানাগুলি), অন্যরা সর্বদা অর্থবোধক মূল্য উপস্থাপন করে (ভাবেন 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_decode ব্যবহার করছিলাম। উপরের কোনওটিই আমার পক্ষে কাজ করেনি, শেষ পর্যন্ত আমি এটি ব্যবহার করেছি:

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

if(json_encode($post_vals->object) != '{}')
{
    // its not empty
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.