Ошибка плагина — array_merge(): аргумент # 2 не является массивом

#php #arrays #wordpress

#php #массивы #wordpress

Вопрос:

Я создаю свой первый плагин WordPress, и журнал ошибок выдает следующие ошибки.

 [06-Jul-2014 20:07:21 UTC] PHP Warning:  array_merge(): Argument #2 is not an array in wp-contentpluginstest-pluginscreen.php on line 49

[06-Jul-2014 20:07:21 UTC] PHP Warning:  array_merge(): Argument #2 is not an array in wp-contentpluginstest-pluginscreen.php on line 50

[06-Jul-2014 20:07:21 UTC] PHP Warning:  end() expects parameter 1 to be array, null given in wp-contentpluginstest-pluginscreen.php on line 323

[06-Jul-2014 20:07:21 UTC] PHP Warning:  Invalid argument supplied for foreach() in wp-contentpluginstest-pluginscreen.php on line 324
  

Для ошибок в строках 49 и 50 код является:

     function register_settings() {
    global $menu;
    global $submenu;
    $this->menus = array_merge(array(), $menu);
    $this->submenus = array_merge(array(), $submenu);
    $this->settings = get_option( $this->settings_name );
    register_setting( 'admin-theme', $this->settings_name );
}
  

Для ошибок в строках 323 и 324 код является:

 function admin_menu() {
    global $menu;
    global $submenu;
    // update menu
    end( $menu );
    foreach ($menu as $k=>amp;$v){
        $id = explode(' <span', $v[0]);
        $slug = 'menu_'.strtolower( str_replace( ' ','_',$id[0] ) );
        $slug_hide = $slug.'_hide';
        if($id[0] != NULL amp;amp; $this->get_setting($slug) !== NULL){
            $v[0] = $this->get_setting($slug). ( isset($id[1]) ? ' <span '.$id[1] : '' );
        }
        if( $this->get_setting($slug_hide) ){
            unset($menu[$k]);
        }
        // update the submenu
        if( isset($submenu[$v[2]]) ){
            foreach ($submenu[$v[2]] as $key=>amp;$val){               
                $id = explode(' <span', $val[0]);
                $slug_sub = $slug.'_'.strtolower( str_replace( ' ','_',$id[0] ) );
                $slug_sub_hide = $slug_sub.'_hide';
                if($id[0] != NULL amp;amp; $this->get_setting($slug_sub) !== NULL){
                    $val[0] = $this->get_setting($slug_sub). ( isset($id[1]) ? ' <span '.$id[1] : '' );
                }
                if( $this->get_setting($slug_sub_hide) ){                       
                    unset( $submenu[$v[2]][$key] );
                }
            }
        }
    }
}
  

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

Комментарии:

1. Аргумент # 2 не является массивом

Ответ №1:

сначала вам нужно проверить, что обе ваши переменные являются array

с is_array() подобным if(is_array($menu))

если нет, используйте приведение типа для преобразования переменной в массив

  if(is_array($menu))
      $this->menus = array_merge(array(), $menu);
    else 
      $this->menus = array_merge(array(), (array)$menu);
    if(is_array($submenu))
      $this->submenus = array_merge(array(), $submenu);
    else
      $this->submenus = array_merge(array(), (array)$submenu);
  

Комментарии:

1. Я использовал type cast для его преобразования, и теперь он выдает только одну ошибку, которая находится в строке 347. В журнале ошибок указано:[07 июля 2014 09:25:48 UTC] Предупреждение PHP: недопустимый аргумент, указанный для foreach() в wp-contentpluginstest-pluginscreen.php в строке 347. Вот код foreach ($menu as $key=>amp;$val){ $id = explode(‘ <span’, $val[0]); $slug = ‘menu_’.strtolower( str_replace( ‘ ‘,’_’,$id[0] ) ); $slug_hide = $slug.’_hide’; if($id[0] != NULL amp;amp; $this-> get_setting($slug) !== NULL){ $val[0] = $this->get_setting($slug). ( isset($id[1]) ? ‘ <span ‘.$id[1] : » ); }

2. поскольку вы снова используете $ menu и это не массив, я думаю, вам нужно $this->menus instaed $menu

3. Спасибо, Ракеш! Это действительно разрушало мой мозг. Высоко ценится!

4. @Bebop если этот ответ действительно помог вам, пожалуйста, примите этот ответ