2012-05-08 14 views
8

मेरे पास ऑब्जेक्ट्स की एक सरणी है। मैं ऑब्जेक्ट में "नाम" मान के आधार पर डुप्लीकेट को हटाना चाहता हूं।ऑब्जेक्ट प्रॉपर्टी के आधार पर सरणी से डुप्लिकेट निकालें?

[0]=> 
    object(stdClass)#337 (9) { 
    ["term_id"]=> 
    string(2) "23" 
    ["name"]=> 
    string(12) "Assasination" 
    ["slug"]=> 
    string(12) "assasination" 
    } 
    [1]=> 
    object(stdClass)#44 (9) { 
    ["term_id"]=> 
    string(2) "14" 
    ["name"]=> 
    string(16) "Campaign Finance" 
    ["slug"]=> 
    string(16) "campaign-finance" 
    } 
    [2]=> 
    object(stdClass)#298 (9) { 
    ["term_id"]=> 
    string(2) "15" 
    ["name"]=> 
    string(16) "Campaign Finance" 
    ["slug"]=> 
    string(49) "campaign-finance-good-government-political-reform" 
    } 

तो इस मामले में, मैं सरणी से डुप्लिकेट "अभियान वित्त" ऑब्जेक्ट को कैसे हटा सकता हूं। तो पूरी [2] वस्तु?

मैं यहां PHP डुप्लिकेट सरणी प्रश्न का एक गुच्छा से गुजर चुका हूं, लेकिन कोई भी ऑब्जेक्ट से निपटने और एक पैरामीटर से फ़िल्टर करने के लिए प्रतीत नहीं होता था।

उत्तर

11

मौजूदा कुंजी के साथ एक नई सरणी बनाएं और केवल नाम के रूप में नाम दें, ध्यान दें कि array_unique (ध्यान दें कि यह कुंजी को सुरक्षित रखता है)।

फिर मूल कुंजी-वार से अद्वितीय 'सरणी में मौजूद सभी चीज़ों को हटा दें।

संपादित करें: पूरा उदाहरण:

class my_obj 
{ 
     public $term_id; 
     public $name; 
     public $slug; 

     public function __construct($i, $n, $s) 
     { 
       $this->term_id = $i; 
       $this->name = $n; 
       $this->slug = $s; 
     } 
} 

$objA = new my_obj(23, "Assasination", "assasination"); 
$objB = new my_obj(14, "Campaign Finance", "campaign-finance"); 
$objC = new my_obj(15, "Campaign Finance", "campaign-finance-good-government-political-reform"); 

$array = array($objA, $objB, $objC); 

echo "Original array:\n"; 
print_r($array); 

/** Answer Code begins here **/ 

// Build temporary array for array_unique 
$tmp = array(); 
foreach($array as $k => $v) 
    $tmp[$k] = $v->name; 

// Find duplicates in temporary array 
$tmp = array_unique($tmp); 

// Remove the duplicates from original array 
foreach($array as $k => $v) 
{ 
    if (!array_key_exists($k, $tmp)) 
     unset($array[$k]); 
} 

/** Answer Code ends here **/ 

echo "After removing duplicates\n"; 
print_r($array); 

आउटपुट:

Original array: 
Array 
(
    [0] => my_obj Object 
     (
      [term_id] => 23 
      [name] => Assasination 
      [slug] => assasination 
     ) 

    [1] => my_obj Object 
     (
      [term_id] => 14 
      [name] => Campaign Finance 
      [slug] => campaign-finance 
     ) 

    [2] => my_obj Object 
     (
      [term_id] => 15 
      [name] => Campaign Finance 
      [slug] => campaign-finance-good-government-political-reform 
     ) 

) 
After removing duplicates 
Array 
(
    [0] => my_obj Object 
     (
      [term_id] => 23 
      [name] => Assasination 
      [slug] => assasination 
     ) 

    [1] => my_obj Object 
     (
      [term_id] => 14 
      [name] => Campaign Finance 
      [slug] => campaign-finance 
     ) 

) 

के रूप में यह term_id 14.

+0

यह करीब है, लेकिन मैं "स्लग" और "term_id" कुंजी के लिए उपयोग की जरूरत है भी। मैं यह देखने के लिए चारों ओर खेल रहा हूं कि मैं इसे समझ सकता हूं या नहीं। –

+0

आपके पास बाद में यह पहुंच है, यह जानने के लिए कि कौन सी कुंजी हटाना है। मैं एक सेकंड में एक पूरा उदाहरण पोस्ट करूंगा। – ccKep

+0

धन्यवाद। एक जटिल जटिल समस्या पर बहुत अच्छा काम करता है जो मैं घंटों तक काम कर रहा हूं। – byron

1

मैं खोज रहा था के रूप में एक ही नाम था term_id 15 के साथ वस्तु हटा दिया गया था इसका एक अच्छा जवाब और एक नहीं मिला, इसलिए मैंने अपना खुद लिखा है जो इस मामले को संभालेगा, और जब आप एकाधिक गुणों के आधार पर डी-डुप्ली करना चाहते हैं।

/** 
* Iterates over the array of objects and looks for matching property values. 
* If a match is found the later object is removed from the array, which is returned 
* @param array $objects The objects to iterate over 
* @param array $props  Array of the properties to dedupe on. 
* If more than one property is specified then all properties must match for it to be deduped. 
* @return array 
*/ 
public function DeDupeArrayOfObjectsByProps($objects, $props) { 
    if (empty($objects) || empty($props)) 
     return $objects; 
    $results = array(); 
    foreach ($objects as $object) { 
     $matched = false; 
     foreach ($results as $result) { 
      $matchs = 0; 
      foreach ($props as $prop) { 
       if ($object->$prop == $result->$prop) 
        $matchs++; 
      } 
      if ($matchs == count($props)) { 
       $matched = true; 
       break; 
      } 

     } 
     if (!$matched) 
      $results[] = $object; 
    } 
    return $results; 
} 

यहाँ अपने मामले के लिए पूर्ण उपयोग है::

$array = DeDupeArrayOfObjectsByProps($array, ['name']); 

यहाँ सामान्य समारोह है

class my_obj { 
    public $term_id; 
    public $name; 
    public $slug; 

    public function __construct($i, $n, $s) { 
     $this->term_id = $i; 
     $this->name = $n; 
     $this->slug = $s; 
    } 
} 

$objA = new my_obj(23, "Assasination", "assasination"); 
$objB = new my_obj(14, "Campaign Finance", "campaign-finance"); 
$objC = new my_obj(15, "Campaign Finance", "campaign-finance-good-government-political-reform"); 
$array = array($objA, $objB, $objC); 

$array = DeDupeArrayOfObjectsByProps($array, ['name']); 
var_dump($array); 
1

मैं एक ही बात की जरूरत ... यहाँ मैं (काम किया है के लिए है this post पर आधारित दोनों सरणी और ऑब्जेक्ट्स)

function my_array_unique_by_subkey($array,$subkey){ 

    $temp = array(); 

    $unique = array_filter($array, function ($v) use (&$temp,$subkey) { 

     if (is_object($v)) $v = (array)$v; 

     if (!array_key_exists($subkey,$v)) return false; 

     if (in_array($v[$subkey], $temp)) { 
      return false; 
     } else { 
      array_push($temp, $v[$subkey]); 
      return true; 
     } 
    }); 

    return $unique; 
} 
0

थोड़ा विषय से हटकर है, लेकिन निकट से संबंधित: बस अपने उदाहरण से वस्तुओं की एक सरणी डेड्यूप लिए सबसे छोटा रास्ता:

/** 
* The array must NOT contain scalars. 
* 
* @param mixed[] $objects 
* @return mixed[] 
*/ 
public static function arrayUniqueForObjects(array $objects): array 
{ 
    $deDuplicatedArray = []; 

    foreach ($objects as $object) { 
     $deDuplicatedArray[spl_object_hash($object)] = $object; 
    } 

    return array_values($deDuplicatedArray); 
} 
+0

'spl_object_hash() 'एक अच्छा विचार है !!! –