PHP - для каждой задачи цикла - PullRequest
1 голос
/ 07 декабря 2011

В Wordpress я пытаюсь создать скрипт metabox с нуля, чтобы лучше понимать и Wordpress, и PHP.

Хотя у меня возникают некоторые проблемы с каждым циклом в многомерном массиве.Я использую PHP5.

Это массив:

$meta_box = array();    
$meta_box[] = array(
            'id' => 'monitor-specs',
            'title' => 'Monitor Specifications',
            'context' => 'normal',
            'priority' => 'default',
            'pages' => array('monitors', 'products'),
            'fields' => array(
                array(
                    'name' => 'Brand',
                    'desc' => 'Enter the brand of the monitor.',
                    'id' => $prefix . 'monitor_brand',
                    'type' => 'text',
                    'std' => ''
                )
            )
        );

И это для каждого цикла:

foreach ($meta_box['pages'] as $post_type => $value) {
            add_meta_box($value['id'], $value['title'], 'je_format_metabox', $post_type, $value['context'], $value['priority']);
        }

Что я пытаюсь сделатьis циклически перебирает ключи в массиве 'pages', который является массивом внутри массива 'meta_box', и в то же время может использовать значения ключей массива 'meta_box'.

Нужно ли мневкладывать несколько для каждого цикла?

Буду благодарен за некоторые указатели в правильном направлении, чтобы я мог решить эту проблему.

Ответы [ 5 ]

1 голос
/ 07 декабря 2011

Может быть, было бы неплохо создать некоторый класс для хранения этой информации.

class Metabox
{
  public $id, $title, $context, $priority, $pages, $fields;

  public function __construct($id, $title, $pages, $fiels, $context='normal', $priority='default')
  {
    $this->id = $id;
    $this->title = $title;
    $this->pages = $pages;
    $this->fields = $fields;
    $this->context = $context;
    $this->priority = $priority;
  }

}

$meta_box = array();

$meta_box[] = new Metabox(
  'monitor-specs', 
  'Monitor Specifications', 
  array('monitors', 'products'),
  array(
    'name' => 'Brand',
    'desc' => 'Enter the brand of the monitor.',
    'id' => $prefix . 'monitor_brand',
    'type' => 'text',
    'std' => ''
  )
);

Теперь вы можете перебирать массив meta_box, например:

foreach ($meta_box as $box)
{
  add_meta_box($box->id, $box->title, .. and more)
  // This function could be placed in the metabox object

  /* Say you want to access the pages array : */
  $pages = $box->pages;

  foreach ($pages as $page)
  {
    ..
  }
}

Теперь у вас все еще естьцикл в цикле, но, возможно, помогает увидеть вашу проблему более четко.

1 голос
/ 07 декабря 2011

Вы ссылаетесь на неправильный ключ массива

$meta_box[] <-- $meta_box[0]

Но вы ссылаетесь, используя: -

foreach ($meta_box['pages'] as $post_type => $value) {

Добавление ключа массива решит проблему: -

foreach ($meta_box[0]['pages'] as $post_type => $value) {
1 голос
/ 07 декабря 2011
foreach ($meta_box[0]['pages'] as $post_type => $value) {

или

$meta_box = array(...
1 голос
/ 07 декабря 2011

это здесь:

$meta_box = array();    
$meta_box[] = array(......

предполагает, что нет $ meta_box ['pages'].meta_box - это массив с числовыми индексами (проверьте оператор []), а каждый из его элементов - это массив, содержащий ключ 'pages'.

, поэтому вам нужно использовать foreach для $ meta_box и для каждого элементавам нужно использовать ключ pages .. id, title, context - это элементы на том же уровне, что и страницы, как вы можете видеть

1 голос
/ 07 декабря 2011

Ваш foreach начинается с $meta_box['pages'], но нет $meta_box['pages'].

У вас есть $meta_box[0]['pages'], поэтому вам нужно две петли:

foreach($meta_box as $i => $box)
    foreach($box['pages'] as $page)
        add_meta_box(.., ..); // do whatever

Что вы ожидали увидеть в переменной $value?

...