2010-11-12 7 views
22

Ho un array oggetti simili:Find chiave matrice negli oggetti array dato un valore di attributo

Array 
(
    [945] => member Object 
     (
      [id] => 13317 
      [name] => Test 999 
      [last_name] => Test 999 
     ) 

    [54] => member Object 
     (
      [id] => 13316 
      [name] => Manuel 
      [last_name] => Maria parra 
     ) 

    [654] => member Object 
     (
      [id] => 13315 
      [name] => Byron 
      [last_name] => Castillo 
     ) 

    [656] => member Object 
     (
      [id] => 13314 
      [name] => Cesar 
      [last_name] => Vasquez 
     ) 
) 

Ho bisogno di rimuovere uno di tali oggetti secondo un valore di attributo.
Per esempio, ho da rimuovere dalla matrice l'ID oggetto 13316.

risposta

68

Ecco l'approccio funzionale:

$neededObjects = array_filter(
    $objects, 
    function ($e) { 
     return $e->id != 13316; 
    } 
); 
+19

Qualcuno ha votato un bel 'array_filter'? * sadface * – erisco

+3

Quanto modesto di voi –

+8

l'array è il primo parametro array_filter, non l'ultimo! http://php.net/manual/en/function.array-filter.php –

0
foreach ($array as $key=>$value) 
     if ($value->id==13316) { 
     unset($array[$key]); 
     break; 
     } 
+0

Grazie per la risposta, ho modificato la mia risposta, le mie chiavi non sono ordinati, voglio dire, non sono 0, 1, 2, 3 .. per favore, date una nuova occhiata al mio aleggiatore, ho cambiato le chiavi dell'array, thk! –

+0

Il codice sopra funzionerà ancora anche con le tue modifiche. – stillstanding

4
function filter_by_key($array, $member, $value) { 
    $filtered = array(); 
    foreach($array as $k => $v) { 
     if($v->$member != $value) 
     $filtered[$k] = $v; 
    } 
    return $filtered; 
} 

$array = ... 
$array = filter_by_key($array, 'id', 13316); 
+1

Se ridefinite la vostra funzione in termini di 'array_filter', guadagnerete il mio voto: D Forse' filter_by_key' sarebbe un nome migliore. – erisco

+0

@erisco, cosa c'è di sbagliato in 'filter_by_member'? –

+0

@erisco, indipendentemente dal fatto che l'ho cambiato in 'filter_by_key' come raccomandato. –

3

Dal momento che c'è già soluzioni abbondanza dati, suggerisco un'alternativa all'utilizzo dell'array:

$storage = new SplObjectStorage; // create an Object Collection 
$storage->attach($memberObject); // add an object to it 
$storage->detach($memberObject); // remove that object 

Si potrebbe fare e questo in una classe personalizzata MemberCollection con metodi Finder e altre operazioni di utilità, ad es.

class MemberCollection implements IteratorAggregate 
{ 
    protected $_storage; 
    public function __construct() 
    { 
     $this->_storage = new SplObjectStorage; 
    } 
    public function getIterator() 
    { 
     return $this->_storage; 
    } 
    public function addMember(IMember $member) 
    { 
     $this->_storage->attach($member); 
    } 
    public function removeMember(IMember $member) 
    { 
     $this->_storage->detach($member); 
    } 
    public function removeBy($property, $value) 
    { 
     foreach ($this->_storage as $member) { 
      if($member->$property === $value) { 
       $this->_storage->detach($member); 
      } 
     } 
    }   
} 

Potrebbe essere eccessivo per il tuo scenario però.

2

Utilizzare la funzione di ricerca di matrice:

//return array index of searched item 

$key = array_search($search_value, array_column($list, 'column_name')); 

$list[key]; //return array item 
Problemi correlati