2011-06-24 13 views
11

Suponiendo que tengo una matriz de objetos en PHP, algo así como:¿Cómo obtener la propiedad del objeto de cada objeto en una matriz?

Array (
    [0] => stdClass Object (
      [id] => 1 
      [name] => Title One 
     )  
    [1] => stdClass Object (
      [id] => 2 
      [name] => Title Two 
     ) 

    [2] => stdClass Object (
      [id] => 7 
      [name] => Title Seven 
     ) 
) 

¿Cuál es la mejor manera (es decir, más rápido) para obtener una matriz de los identificadores? es decir, array(1,2,7) puedo hacer un ciclo manualmente pero creo que debe haber un mejor método.

Acabo de ver this in the similar questions pero hay un pequeño debate sobre si la respuesta aceptada es realmente la mejor, además es de hace 2 años. Estoy en PHP 5.3.

+1

Dependiendo de su escenario, es posible que desee considerar el uso de un [conjunto asociativo] (http://php.net/manual/en/language.types.array.php) en lugar de una matriz de objetos con un 'id 'miembro. –

Respuesta

3

La manera más rápida es simplemente hacer bucles (foreach, for, while). El uso de funciones de devolución de llamada implica una sobrecarga innecesaria.

Me gustaría ver si hay una manera de crear la lista a través del código que está construyendo la matriz inicial de objetos.

0

¿Has probado la función array_keys?

EDIT:

<?php 
    $ids = array(); 
    for($c=0; $c<count($the_array); $c++) $ids[$c] = $the_array[$c]->id; 
?> 
+0

En el ejemplo, 'array_keys' devolvería' [0,1,2] 'not' [1,2,7] '. Pero creo que podría almacenar las identificaciones como teclas de matriz ... – DisgruntledGoat

+0

Sí, así es. Creo que la iteración es obligatoria. Si no desea iterar, el uso de funciones como array_map lo hará por usted en cualquier caso y esto generará una sobrecarga innecesaria causada al llamar a la función de devolución de llamada (según lo informado por @webbiedave). Estoy editando mi publicación agregando la "solución obvia". – bitfox

8

Puede utilizar array_map para obtener los identificadores de cada elemento.

function getID($a){ 
    return $a->id; 
} 
$IDs = array_map('getID', $array); 

Demostración: http://ideone.com/nf3ug

0

También puede utilizar extract_property() que es una biblioteca bien probado diseñado específicamente para este trabajo (exención de responsabilidad: yo soy el autor).

0

estoy usando Redbean y por alguna razón que pasa en "getID" no funcionó para mí, así que aquí es cómo lo he hecho:

$ids = array_map(function($val){return $val->id;}, $objects); 
4

Desde PHP 7.0 puede usar la función incorporada array_column para que, que tiene una matriz de entrada y el nombre de la propiedad que desea arrancar:

$ids = array_column($input, 'id'); 
// array(0 => 1, 1 => 2, 2 => 7) 

Como un tercer parámetro, puede suministrar opcionalmente una índice de clave, así:

$ids = array_column($input, 'name', 'id'); 
// array(1 => 'Title One', 2 => 'Title Two', 7 => 'Title Seven') 

Tenga en cuenta que, a pesar de que ya está disponible en PHP 5.5.0, soporte para una gran variedad de objetos se introdujo por primera vez en PHP 7.0.

Cuestiones relacionadas