Как построить массивы объектов в PHP без указания номера индекса? - PullRequest
15 голосов
/ 14 сентября 2010

Вот странный вопрос. Я строю массив объектов вручную, например:

$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";

Мне нравится, насколько это ясно, но поскольку мне нужно указать номер индекса, я не могу их легко переставить. Как я могу сделать это без номера индекса? Связано, что является лучшим способом сделать это?

Я также попытался написать это, создав класс, и чтобы каждое место в массиве было экземплярами этого класса. Но так как это файл конфигурации, было трудно прочитать и узнать, какой аргумент использовался с каким параметром. Вот почему я выбрал этот метод старой школы выше.

Любые мысли очень ценятся!

Ответы [ 5 ]

27 голосов
/ 14 сентября 2010

Этот код

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

недопустимо в любом случае - вы получите «строгое» предупреждение, если не инициализируете объект должным образом. Таким образом, вы должны как-то сконструировать объект - либо с помощью конструктора:

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

или с использованием приведения типа stdclass

 $pages_array[] = (object) array('slug' => 'xxx', 'title' => 'etc')
6 голосов
/ 14 сентября 2010

Если вы делаете их массивами с именованными ключами, а не объектами, вы можете сделать это так:

$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'
     )
);

Вы можете комбинировать это с решением Fanis и использовать слизняки в качестве ключей, если хотите.

2 голосов
/ 14 сентября 2010

Предполагая, что вы не устанавливаете какие-либо элементы $pages_array в другом месте, вы можете установить простую переменную.

$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++;

Вы просто должны помнить, что нужно увеличивать $i каждый раз, чтобы не перезаписыватьэлемент.

1 голос
/ 14 сентября 2010

Предполагая, что слаг будет уникальным, возможно, используйте его для идентификации ваших массивов страниц:

$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' ;

и т.д.

Вам просто нужно использовать ключ массива, чтобы получить значение слага.

0 голосов
/ 14 сентября 2010

Если вы хотите сохранить индексы последовательности.Может быть, это поможет.

$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";

Чек

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...