2010-09-14 8 views
8

Aquí hay una pregunta extraña. Estoy construyendo una matriz de objetos de forma manual, como esto:cómo construir matrices de objetos en PHP sin especificar un número de índice?

$pages_array[0]->slug = "index"; 
$pages_array[0]->title = "Site Index"; 
$pages_array[0]->template = "interior"; 

$pages_array[1]->slug = "a"; 
$pages_array[1]->title = "100% Wide (Layout A)"; 
$pages_array[1]->template = "interior"; 

$pages_array[2]->slug = "homepage"; 
$pages_array[2]->title = "Homepage"; 
$pages_array[2]->template = "homepage"; 

me gusta cómo tajante esto es, sino porque tengo que especificar el número de índice, no puedo reorganizar fácilmente. ¿Cómo puedo hacer esto sin el número de índice? Relacionado, ¿cuál es una mejor manera de hacer esto?

También intenté escribir esto haciendo una clase y teniendo cada punto en la matriz instancias de esa clase. Pero dado que este es un archivo de configuración, fue difícil de leer y saber qué argumento fue con qué parámetro. Es por eso que elegí este método de la vieja escuela anterior.

¡Cualquier idea es muy apreciada!

+0

* (sidenote) * PHP tiene una clase nativa para almacenar colecciones de objetos con ['SplObjectStorage'] (http://de.php.net/manual/en/class.splobjectstorage.php). Si necesita los objetos en un orden específico, eche un vistazo a ['SplMaxHeap'] (http://github.com/salathe/spl-examples/wiki/SplMaxHeap) – Gordon

+0

por favor aclare la pregunta. ¿Qué intentas lograr "reorganizando" y en general? – Gordon

Respuesta

19

Este código

$pages_array[1]->slug = "a"; 

no es válido de todos modos - que obtendrá una advertencia "estricta" si no inicializar el objeto correctamente. Así que hay que construir un objeto de alguna manera - ya sea con un constructor:

$pages_array[] = new MyObject('index', 'title'....) 

o utilizando un stdClass lanzas

$pages_array[] = (object) array('slug' => 'xxx', 'title' => 'etc') 
+3

+1 para la fundición de objetos. Así es como lo hago. –

+0

Gracias @ user187291, fundición de objetos funcionó para mí –

1

Suponiendo que la bala será única, tal vez lo utilizan para identificar sus matrices página:

$pages_array = array() ; 

$pages_array['index'] = array() ; 
$pages_array['index']['title'] = 'Site Index' ; 
$pages_array['index']['template'] = 'interior' ; 

$pages_array['a'] = array() ; 
$pages_array['a']['title'] = '100% Wide (Layout A)' ; 
$pages_array['a']['template'] = 'interior' ; 

etc

Usted sólo tendrá que usar la clave de la matriz para obtener su valor babosa.

4

Si los hacen matrices con claves denominadas en lugar de objetos, puede hacerlo de esta manera:

$pages_array = array(
    array(
     'slug' => 'index', 
     'title' => 'Site Index', 
     'template' => 'interior' 
    ), 

    array(
     'slug' => 'a', 
     'title' => '100% Wide (Layout A)', 
     'template' => 'interior' 
    ), 

    array(
     'slug' => 'homepage', 
     'title' => 'Homepage', 
     'template' => 'homepage' 
    ) 
); 

Esto se puede combinar con una solución de Fanis' y utilizar las babosas como las claves, si quieres.

0

Si desea mantener los índices de secuencia. Tal vez esto ayude.

$pages_array[]->slug = "index"; 
$key = array_search(end($pages_array),$pages_array); 
$pages_array[$key]->title = "Site Index"; 
$pages_array[$key]->template = "interior"; 

$pages_array[]->slug = "a"; 
$key = array_search(end($pages_array),$pages_array); 
$pages_array[$key]->title = "100% Wide (Layout A)"; 
$pages_array[$key]->template = "interior"; 

$pages_array[]->slug = "homepage"; 
$key = array_search(end($pages_array),$pages_array); 
$pages_array[$key]->title = "Homepage"; 
$pages_array[$key]->template = "homepage"; 

Check

2

Suponiendo que no está configurando cualquier $pages_array elementos en otro lugar, puede establecer una variable simple.

$i = 0; 

$pages_array[$i]->slug = "index"; 
$pages_array[$i]->title = "Site Index"; 
$pages_array[$i]->template = "interior"; 
$i++; 

$pages_array[$i]->slug = "a"; 
$pages_array[$i]->title = "100% Wide (Layout A)"; 
$pages_array[$i]->template = "interior"; 
$i++; 

$pages_array[$i]->slug = "homepage"; 
$pages_array[$i]->title = "Homepage"; 
$pages_array[$i]->template = "homepage"; 
$i++; 

sólo hay que recordar para incrementar $i cada vez para que no sobrescribir un elemento.

+0

Estas son ideas increíbles, gracias a todos! La fundición de objetos y el uso de una variable para el índice son soluciones geniales y sencillas para mi problema, muy apreciadas. – dylanized

Cuestiones relacionadas