Объединить и построить массив с foreach php - PullRequest
0 голосов
/ 29 апреля 2020

Мне нужно построить многомерный массив с помощью foreach. Существует массив с именами социальных сетей social_array()

результат должен быть таким:

array(
    'type'          => 'textfield',
    'heading'       => 'social_label1',
    'param_name'    => 'social_name1',
    'description'   => '',
    'edit_field_class' => 'vc_col-sm-4 vc_column-with-padding',
    'group' => __('Social', 'AS')
),
array(
    'type'          => 'textfield',
    'heading'       => 'social_label2',
    'param_name'    => 'social_name2',
    'description'   => '',
    'edit_field_class' => 'vc_col-sm-4 vc_column-with-padding',
    'group' => __('Social', 'AS')
),
...
etc

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

foreach ( social_array() as $icon => $value ) :
    $k = array('type', 'heading', 'param_name', 'description', 'edit_field_class', 'group');
    $v = array('textfield', $value['label'], $icon, '', 'vc_col-sm-4 vc_column-with-padding', 'Social');
    $c = array_combine($k, $v);
    $attributes['params'] = $c;
endforeach;
vc_add_params( 'profile_card', $attributes ); // Note: base for element

Социальный при необходимости

function social_array(){
        return array(
            'facebook'      =>  array('label' => __('Facebook','AS7'), 'type' => 'text' ),
            'behance'       =>  array('label' => __('Behance','AS7'), 'type' => 'text' ),
            'weibo'         =>  array('label' => __('Weibo','AS7'), 'type' => 'text' ),
            'renren'        =>  array('label' => __('Renren','AS7'), 'type' => 'text' ),
            'dropbox'       =>  array('label' => __('Dropbox','AS7'), 'type' => 'text' ),
            'bitbucket'     =>  array('label' => __('Bitbucket','AS7'), 'type' => 'text' ),
            'trello'        =>  array('label' => __('Trello','AS7'), 'type' => 'text' ),
            'odnoklassniki' =>  array('label' => __('Odnoklassniki','AS7'), 'type' => 'text' ),
            'vk'            =>  array('label' => __('VKontakte','AS7'), 'type' => 'text' ),
            );
    }

Ответы [ 3 ]

0 голосов
/ 29 апреля 2020
$attributes['params'] = $c;

Это проблема, в любом цикле вы устанавливаете это значение в $ c, поэтому в последнем цикле вы устанавливаете $ атрибуты для самого последнего $ c. Если вы хотите, чтобы $ attribute ['params'] содержал все массивы, вам нужно использовать следующий синтаксис:

$attributes['params'][] = $c;

ИЛИ такой же, но с вызовом функции:

array_push($attributes['params'], $c);
0 голосов
/ 29 апреля 2020

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

Задача состояла в том, чтобы динамически добавлять многие поля одного и того же типа в настройках шорткода с помощью Visual Composer и функции vc_add_params ()

$attributes = array();
foreach ( social_array() as $icon => $value ) :
    $k = array('type', 'heading', 'param_name', 'description', 'edit_field_class', 'group');
    $v = array('textfield', $value['label'], 'as_'.$icon, '', 'vc_col-sm-4 vc_column-with-padding', 'Social');
    $c = array_combine($k, $v);

    $attributes[] = $c;
endforeach;
vc_add_params( 'as_profile_card', $attributes ); // Note: base for element
0 голосов
/ 29 апреля 2020

Для этого вам понадобится 2 foreach петли, потому что первый foreach l oop дает вам все массивы внутри него. тогда вам нужно получить доступ к каждому массиву и l oop поверх него.

foreach ( social_array() as $array) :
   foreach ( $array as $icon => $value ):
    //Do something with $icon and its $value
  endforeach;
endforeach;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...