2011-02-18 6 views
16

क्या ऐसा कोई कार्य है जैसे in_array, लेकिन वस्तुओं पर उपयोग किया जा सकता है?in_array - 'in_object' समतुल्य?

+0

आपको ऐसा करने की आवश्यकता क्यों है? ऑब्जेक्ट्स को सरणी के रूप में नहीं माना जाना चाहिए। – BoltClock

+0

किसी SimpleXML ऑब्जेक्ट या बस मानों की ऑब्जेक्ट से निपटने के बारे में क्या? किसी ऑब्जेक्ट में कोई मान मौजूद है या नहीं, यह देखने का अनुशंसित तरीका क्या है? –

उत्तर

22

नहीं, लेकिन आप ऑब्जेक्ट को सरणी में डाल सकते हैं और इसे in_array() में पास कर सकते हैं।

$obj = new stdClass; 
$obj->one = 1; 
var_dump(in_array(1, (array) $obj)); // bool(true) 

हालांकि सभी प्रकार के ओओपी सिद्धांतों का उल्लंघन करता है। अपने प्रश्न और Aron's answer पर मेरी टिप्पणी देखें।

6

आप एक सरणी के लिए वस्तु डाली सकता है:

सभी की
$obj = new stdClass(); 
$obj->var = 'foobar'; 
in_array('foobar', (array)$obj); // true 
12

पहले, arrays और objectsकाफी अलग हैं।

डिफ़ॉल्ट रूप से एक PHP ऑब्जेक्ट को सरणी की तरह पुनरावृत्त नहीं किया जा सकता है। ऑब्जेक्ट पुनरावृत्ति को लागू करने का एक तरीका इटरेटर इंटरफ़ेस को कार्यान्वित करना है।

$object = new obj(); 
var_dump(isset($obj['two'])); // exists! 
var_dump(isset($obj['foo'])); // does not exist 

से पहले:

class obj implements ArrayAccess { 
    private $container = array(); 
    public function __construct() { 
     $this->container = array(
      "one" => 1, 
      "two" => 2, 
      "three" => 3, 
     ); 
    } 
    public function offsetSet($offset, $value) { 
     if (is_null($offset)) { 
      $this->container[] = $value; 
     } else { 
      $this->container[$offset] = $value; 
     } 
    } 
    public function offsetExists($offset) { 
     return isset($this->container[$offset]); 
    } 
    public function offsetUnset($offset) { 
     unset($this->container[$offset]); 
    } 
    public function offsetGet($offset) { 
     return isset($this->container[$offset]) ? $this->container[$offset] : null; 
    } 
} 

अब आप निम्नलिखित तरीके से एक सरणी की तरह अपने वस्तु का उपयोग कर सकते हैं:

अपने विशिष्ट प्रश्न के संबंध में, आप शायद ArrayAccess interface पर एक नज़र लेने के लिए आप इस पर पागल हो जाते हैं, कृपया विचार करें कि आप वास्तव में यह क्यों करने की कोशिश कर रहे हैं और php.net पर उदाहरण देखें।

विकल्प 2: जब आप बस की कोशिश कर रहे है, तो एक संपत्ति मौजूद है देखते हैं, तो आप इस के लिए property_exists() उपयोग कर सकते हैं:

class foo { 
    public $bar = 'baz'; 
} 

$object = new foo(); 
var_dump(property_exists($object, 'bar')); // true 
2

मैं, इसकी सलाह नहीं देते, क्योंकि यह बहुत बुरा व्यवहार है लेकिन आप get_object_vars का उपयोग कर सकते हैं।

दायरे के अनुसार दिए गए ऑब्जेक्ट के सुलभ गैर स्थैतिक गुण प्राप्त करता है।

अन्य सीमाएं हैं जिन्हें आप दस्तावेज को संदर्भित करना चाहिए ताकि यह देखने के लिए कि यह आपके लिए उपयुक्त है या नहीं।

if(in_array('find me', get_object_vars($obj))) 
5
function in_object($needle, $haystack) { 
    return in_array($needle, get_object_vars($haystack)); 
} 
3

यह अविश्वसनीय कैसे सभी लोगों को एक in_object पीएचपी विधि की उपयोगिता की बात याद आती है है! यहां मैं जो आया हूं, यह बहुत उपयोगी है, और आप देखेंगे क्यों!

यहां लिखा गया एक साधारण कार्य है जो जांच करेगा कि किसी ऑब्जेक्ट में कोई मूल्य पाया जा सकता है या नहीं।

<?php 
    // in_object method 
    // to check if a value in an object exists. 
    function in_object($value,$object) { 
    if (is_object($object)) { 
     foreach($object as $key => $item) { 
     if ($value==$item) return $key; 
     } 
    } 
    return false; 
    } 
?> 

यह बहुत उपयोगी है एक वस्तु बना दिया गया है, तो गतिशील, और आप डॉन (विशेष रूप से बाहरी कोड है, जो आपको एक एप्लिकेशन-प्लगइन, सीएमएस, आदि के रूप में नियंत्रित नहीं करते हैं, से) ' वस्तु की गुणों को नहीं जानता। उपरोक्त फ़ंक्शन संपत्ति वापस कर देगा, इसलिए आप इसे बाद में अपने कोड में उपयोग करने में सक्षम होंगे।

यह एक बहुत अच्छा बुनियादी उदाहरण है कि यह फ़ंक्शन कितना उपयोगी है!

<?php 
    class My_Class { 
    function __construct($key, $value) { 
     $this->$key = $value; 
     // As you can see, this is a dynamic class, its properties and values can be unknown... 
    } 
    } 

    function in_object($value,$object) { 
    if (is_object($object)) { 
     foreach($object as $key => $item) { 
     if ($value==$item) return $key; 
     } 
    } 
    return false; 
    } 

    function manipulate_property($value,$object) { 
    if ($property = in_object($value,$object)) { 
     // value found. I can now use this property. 
     // I can simply echo'it (makes no sense, as I could instead simply echo "value") 
     echo "<br />I found the property holding this value: ".$object->$property; 
     // or (here comes the good part) 
     // change the property 
     $object->$property = "This is a changed value!"; 
     echo "<br />I changed the value to: ".$object->$property; 
     // or return it for use in my program flow 
     return $property; 
    } else { 
     echo "Value NOT FOUND!<br />"; 
     return false; 
    } 
    } 

    // imagine if some function creates the class conditionally... 
    if (1 == 1) { 
    $class = new My_Class("property","Unchanged Value"); 
    } else { 
    $class = new My_Class("property","Some Other Value"); 
    } 

    // now let's check if the value we want exists, and if yes, let's have some fun with it... 
    $property = manipulate_property("Unchanged Value",$class); 
    if ($property) { 
    $my_variable = $class->$property; 
    echo "<br />This is my variable now:".$my_variable; 
    } else $my_variable = $some_other_variable; 
?> 

बस इसे अपने आप देखने के लिए चलाएं!

+0

क्या होगा यदि कोई संख्या '0' की तलाश में है और बूलियन मान प्राप्त करने की अपेक्षा करता है? – Matt

0

यह सबसे कुशल और सही समाधान है। कुछ संशोधनों के साथ किसी भी वस्तु में मौजूद किसी भी डेटा प्रकार को जांचने के लिए इसे लागू किया जा सकता है।

if(gettype($object->var1->var2) == "string"){ 
echo "Present"; 
} 
संबंधित मुद्दे