web-dev-qa-db-ja.com

PHPでオブジェクトが空であることを確認する方法は?

PHPでオブジェクトが空かどうかを確認する方法。

以下は、$objがXMLデータを保持しているコードです。空かどうかを確認するにはどうすればよいですか?

私のコード:

$obj = simplexml_load_file($url);
89
sandbox

配列にキャストして、空かどうかを確認できます

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

編集:以下のような単一行のタイプキャストは、PHP 5.4では機能しません。

if (empty((array) $obj)) {
    //do stuff
}
112
Peter Kelly

Edit:SimpleXMLElementオブジェクトが空かどうかを明確に確認したいとは思わなかった。古い答えを下に残しました

更新された回答(SimpleXMLElement)

SimpleXMLElementの場合:

空の場合、プロパティがないことを意味します:

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

OR

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

SimpleXMLElementが1レベルの深さであり、空の場合、実際にはプロパティのみを持つことを意味します PHPはfalseyを考慮します (またはプロパティなし):

$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

Edit:サンプルを追加

$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
29
Timothy Zorn

オブジェクトを配列にキャストし、そのカウントを次のようにテストできます。

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

empty()オーバーロードメソッドが宣言されている場合は代わりに呼び出されるため、__isset()をオブジェクトで使用する場合、通常どおり機能しません。

したがって、count()を使用できます(オブジェクトが Countable の場合)。

または、get_object_vars()を使用して、たとえば.

get_object_vars($obj) ? TRUE : FALSE;
7
kenorb

オブジェクトが空でなく、かなり大きい場合、リソースを無駄にして配列にキャストしたり、シリアライズしたりする理由を想像してください...

これは私がJavaScriptで使用する非常に簡単なソリューションです。オブジェクトを配列にキャストして空かどうかをチェックする、またはJSONにエンコードする前述のソリューションとは異なり、この単純な関数は、単純なタスクを実行するために使用されるリソースに関して非常に効率的です。

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

    return TRUE;
}

ソリューションは非常に簡単な方法で機能します。オブジェクトが空の場合はforeachループに入らず、trueを返します。空でない場合は、foreachループに入り、falseループに戻り、セット全体を通過しません。

7
stamat

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 ) );
7
biziclop

オブジェクトが空であるかどうかを確認するユニークな安全な方法はありません

phpのcount()は最初に配列にキャストしますが、キャストによって空の配列が生成される可能性があり、オブジェクトの実装方法によって異なります(拡張機能のオブジェクトはこれらの問題の影響を受けることがよくあります)

あなたの場合、$ obj-> count()を使用する必要があります。

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

(これはphpのカウントではありません http://www.php.net/count

2
user652649

PHPで何かを(bool)としてキャストすると、アイテムがオブジェクト、プリミティブ型、またはnullであるかどうかがすぐにわかります。次のコードを使用します。

$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
roosevelt

オブジェクトが「空」であるかどうかは定義の問題であり、クラスが表すオブジェクトの性質に依存するため、クラスが定義する必要があります。

PHP自体は、クラスのすべてのインスタンスを空ではないと見なします。

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

// results in bool(false)

「空の」オブジェクトの一般的な定義はありません。上記の例では、empty()の結果はtrueであると主張するかもしれません。これは、オブジェクトがコンテンツを表さないためです。しかし、PHPはどうやって知るのでしょうか?一部のオブジェクトはコンテンツを表すことを決して意図していません(たとえば、工場を考えてください)、他のオブジェクトは常に意味のある値を表します(new DateTime()を考えてください)。

つまり、特定のオブジェクトに対する独自の基準を考え出し、それに応じて、オブジェクトの外部から、またはオブジェクト内の自己記述isEmpty()メソッドからテストする必要があります。

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

または

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