2010-08-26 22 views
23

PHP में ऑब्जेक्ट्स की सरणी से ऑब्जेक्ट को निकालने का एक शानदार तरीका क्या है?PHP: सरणी से ऑब्जेक्ट निकालें

बस स्पष्ट होना ..

class Data{ 

    private $arrObservers; 

    public add(Observer $o) { 
    array_push($this->arrObservers, $o); 
    }  
    public remove(Observer $o) { 
    // I NEED THIS CODE to remove $o from $this->arrObservers 
    } 

} 
+0

मुझे लगता है कि आपका मतलब है 'array_push ($ this-> arrObservers, $ o) '? – deceze

उत्तर

37

आप

function unsetValue(array $array, $value, $strict = TRUE) 
{ 
    if(($key = array_search($value, $array, $strict)) !== FALSE) { 
     unset($array[$key]); 
    } 
    return $array; 
} 

कर सकते हैं तुम भी spl_object_hash का उपयोग की वस्तुओं के लिए एक हैश बनाने के लिए कर सकते हैं और प्रयोग के रूप में है कि सरणी कुंजी

हालांकि, पीएचपी भी SplObjectStorage साथ वस्तु संग्रह के लिए एक देशी डेटा संरचना है:

$a = new StdClass; $a->id = 1; 
$b = new StdClass; $b->id = 2; 
$c = new StdClass; $c->id = 3; 

$storage = new SplObjectStorage; 
$storage->attach($a); 
$storage->attach($b); 
$storage->attach($c); 
echo $storage->count(); // 3 

// trying to attach same object again 
$storage->attach($c); 
echo $storage->count(); // still 3 

var_dump($storage->contains($b)); // TRUE 
$storage->detach($b); 
var_dump($storage->contains($b)); // FALSE 

SplObjectStorageTraversable है, इसलिए आप कर सकते हैं foreach इस पर भी है।

एक sidenote पर, PHP के पास Subject और Observer के लिए देशी इंटरफेस भी हैं।

+3

+1 यह सबसे अच्छा तरीका है। उल्लेख नहीं है कि PHP 5.3 के रूप में, 'SplObjectStorage'' ArrayAccess' लागू करता है। –

+1

मैं 'if (($ key = array_search ($ value, $ array, $ सख्त)) का उपयोग करने का सुझाव दूंगा! == झूठी)' cuz '0 == false' – Anpher

+0

@Anpher अच्छी कॉल। फिक्स्ड। हालांकि मुझे सच में लगता है कि यदि ओपी को संभालने के लिए केवल ऑब्जेक्ट्स हैं तो OP को SplObjectStorage का उपयोग करना चाहिए। – Gordon

3

unset($myArray[$index]); जहां $index तत्व आप निकालना चाहते हैं के सूचकांक है। यदि आप एक और विशिष्ट उत्तर नहीं चाहते हैं, तो कुछ कोड दिखाएं या वर्णन करें कि आप क्या करने का प्रयास कर रहे हैं।

+0

यह ठीक है, लेकिन मैं किसी ऑब्जेक्ट की अनुक्रमणिका कैसे ढूंढूं? सरणी में मूल्यों से खोजें? – danidacar

+0

@daniphp आप ऑब्जेक्ट की तुलना === के साथ कर सकते हैं। –

3
$obj_array['obj1'] = $obj1; 
$obj_array['obj2'] = $obj2; 
$obj_array['obj3'] = $obj3; 
unset($obj_array['obj3']); 
+2

-1 क्योंकि ओपी कार्य को ऑब्जेक्ट देता है, कुंजी नहीं और इसलिए यह उदाहरण अपूर्ण है। –

6

मैं आईडी (एक जब आपके पास, कुछ भी है कि उस वस्तु के लिए अद्वितीय हो जाएगा कारण के भीतर काम करना चाहिए) सरणी कुंजी के रूप में वस्तु का उपयोग करने की अनुशंसा। इस तरह आप किसी लूप के माध्यम से चलाने के बिना सरणी के भीतर ऑब्जेक्ट को संबोधित कर सकते हैं या किसी अन्य स्थान पर आईडी स्टोर कर सकते हैं। कोड कुछ इस तरह दिखेगा:

$obj_array[$obj1->getId()] = $obj1; 
$obj_array[$obj2->getId()] = $obj2; 
$obj_array[$obj3->getId()] = $obj3; 

unset($obj_array[$object_id]); 

अद्यतन:

class Data{ 

    private $arrObservers; 

    public add(Observer $o) { 
    $this->arrObservers[$o->getId()] = $o; 
    }  
    public remove(Observer $o) { 
    unset($this->arrObservers[$o->getId()]); 
    } 

} 
+1

हालांकि, आपको पर्यवेक्षक ऑब्जेक्ट के लिए getId() विधि की आवश्यकता होगी। –

13

मैं ऊपर जवाब के साथ सहमत हैं, लेकिन पूर्णता के लिए (जहाँ आप एक कुंजी के रूप में उपयोग करने के लिए अद्वितीय आईडी नहीं हो सकता है) के लिए एक सरणी से मानों को दूर करने के मेरे पसंदीदा तरीके हैं इस प्रकार है:

/** 
* Remove each instance of a value within an array 
* @param array $array 
* @param mixed $value 
* @return array 
*/ 
function array_remove(&$array, $value) 
{ 
    return array_filter($array, function($a) use($value) { 
     return $a !== $value; 
    }); 
} 

/** 
* Remove each instance of an object within an array (matched on a given property, $prop) 
* @param array $array 
* @param mixed $value 
* @param string $prop 
* @return array 
*/ 
function array_remove_object(&$array, $value, $prop) 
{ 
    return array_filter($array, function($a) use($value, $prop) { 
     return $a->$prop !== $value; 
    }); 
} 

जिसका उपयोग निम्न तरीके से किया जाता है:

$values = array(
    1, 2, 5, 3, 5, 6, 7, 1, 2, 4, 5, 6, 6, 8, 8, 
); 
print_r(array_remove($values, 6)); 

class Obj { 
    public $id; 
    public function __construct($id) { 
     $this->id = $id; 
    } 
} 
$objects = array(
    new Obj(1), new Obj(2), new Obj(4), new Obj(3), new Obj(6), new Obj(4), new Obj(3), new Obj(1), new Obj(5), 
); 
print_r(array_remove_object($objects, 1, 'id')); 

आशा है कि मदद करता है।

-2

मेरा मानना ​​है कि यह सबसे अच्छा तरीका है

$index = array_search($o, $this->arrObservers, true); 

unset($this->arrObservers[$index]); 
-1

इस प्रयास करें, आपकी समस्या का समाधान नहीं है। बजाय अपने आंतरिक वस्तु भंडारण के लिए

class Data{ 
    private $arrObservers; 

    public add(Observer $o) { 
    array_push($this->arrObservers,$o); 
    }  

    public remove($Observer $o) { 
    unset($this->arrObservers[$o]); 
    } 
} 
+1

array_push एक संख्यात्मक कुंजी असाइन करेगा, इसलिए आपको कुंजी के रूप में $ o नहीं मिलेगा, भले ही सरणी कुंजी के लिए ऑब्जेक्ट्स का उपयोग कर सकें – Gordon

0
function obj_array_clean ($array, $objId) 
{ 
    $new = array() ; 
    foreach($array as $value) 
    { 
     $new[$value->{$objId}] = $value; 
    } 
    $array = array_values($new); 
    return $array; 
} 

$ext2 = obj_array_clean($ext, 'OnjId'); 
  • यह सरणी से डुप्लिकेट वस्तु "OnjId" निकाल देंगे $ सरणी वस्तुओं।
1

एक वस्तु एक multi dimensional array से आप इस का उपयोग कर सकते हटाने के लिए: array_column साथ

$exampleArray= [ 
    [ 
     "myKey"=>"This is my key", 
     "myValue"=>"10" 
    ], 
    [ 
     "myKey"=>"Oh!", 
     "myValue"=>"11" 
    ] 
]; 

आप अपने प्रमुख स्तंभ नाम निर्दिष्ट कर सकते हैं:

if(($key = array_search("Oh!", array_column($exampleArray, 'myKey'))) !== false) { 
    unset($exampleArray[$key]); 
} 

और यह संकेत वस्तु को हटा देगा।

संबंधित मुद्दे