Как создать новый ключ массива во внутреннем ключе существующего ассоциативного массива?

Я следую двум массивам следующим образом:

$test_array = array('frequencyCapping','images','sizes');

$soap_arr = array(
        'lineItemId' => '',
        'creativeData' => array(
            'name' => '',
            'adType' => '',
            'clickUrl' => '',
            'weight' => '',
            'width' => '',
            'height' => '',
            'landingPageId' => '',
            'text' => '',
            'frequencyCapping' => array(
                'interval' => '',
                'mount' => ''
              ),
            'images' => array(
              'file' => array(
                      'referenceUrl' => '',
                      'binaryContent' => ''
                  ),
              'externalUrl' => '',
              'sizes' => array(
                      'text' => '',
                      'clickUrl' => '',
                      'track' => '',
                      'width' => '',
                      'height' => ''
                  ),
            )
        )
    );

На самом деле я привел выше один массив. Фактический массив зависит от значений формы, заполненных пользователем. Теперь я хочу рекурсивно перебрать этот массив и найти совпадающие ключи, если ключи совпадают, затем создать новый ключ массива как [0]=>Array внутри него и добавить к нему все оставшееся содержимое. Для этого я написал следующую функцию, но она не работает, так как перезаписывает все созданные элементы массива. На самом деле он не генерирует желаемый массив, который я хотел.

function update_array($soap_arr, $test_array) {

    foreach ($soap_arr as $key => $value) {

        // if key found then move value to 0th position
        if(in_array($key, $test_array)) {
            $temp = $soap_arr[$key]; 
            unset($soap_arr[$key]);
            $soap_arr[$key][0] = $temp;
        }

        // recursive call 
        if(is_array($value)) {
            update_array($value, $test_array);
        }
    }

    //print_r($soap_arr);
    return $soap_arr;
}

// updation not preserved outside of foreach
$ar = update_array($soap_arr, $test_array);
print_r($ar)

Желаемый результирующий массив должен быть следующим:

Array
(
    [lineItemId] => 
    [creativeData] => Array
        (
            [name] => 
            [adType] => 
            [clickUrl] => 
            [weight] => 
            [width] => 
            [height] => 
            [landingPageId] => 
            [text] => 
            [frequencyCapping] => Array
                (
                    [0] => Array
                        (
                            [interval] => 
                            [amount] => 
                        )

                )

            [images] => Array
                (
                    [0] => Array
                        (
                            [file] => Array
                                (
                                    [referenceUrl] => 
                                    [binaryContent] => 
                                )

                            [externalUrl] => 
                            [sizes] => Array
                                (
                                    [0] => Array
                                        (
                                            [text] => 
                                            [clickUrl] => 
                                            [track] => 
                                            [width] => 
                                            [height] => 
                                        )

                                )
                        )



                )

        )

)

Может ли кто-нибудь помочь мне в этом отношении, пожалуйста? Заранее спасибо.


person PHPLover    schedule 30.01.2014    source источник


Ответы (1)


Попробуйте. Создайте новый массив, потому что мы можем сбросить итератор для soap_arr, если будем вносить изменения в этот массив. Также вызовите рекурсивный первый.

$test_array = array('frequencyCapping','images','sizes');
$soap_arr = array(
      'lineItemId' => '',
      'creativeData' => array(
          'name' => '',
          'adType' => '',
          'clickUrl' => '',
          'weight' => '',
          'width' => '',
          'height' => '',
          'landingPageId' => '',
          'text' => '',
          'frequencyCapping' => array(
              'interval' => '',
              'mount' => ''
            ),
          'images' => array(
            'file' => array(
                    'referenceUrl' => '',
                    'binaryContent' => ''
                ),
            'externalUrl' => '',
            'sizes' => array(
                    'text' => '',
                    'clickUrl' => '',
                    'track' => '',
                    'width' => '',
                    'height' => ''
                ),
          )
      )
  );

function update_array($soap_arr, $test_array) {
  $new_array = array();

  foreach ($soap_arr as $key => $value) {
      // call recursive first, because we can override changes.
      // recursive call 
      if (is_array($value)) {
          $new_array[$key] = update_array($value, $test_array);
      }
      // if key found then move value to 0th position
      if(in_array($key, $test_array)) {
          if (!isset($new_array[$key])) {
              $new_array[$key] = array();
          }
          $new_array[$key][] = $value;
      }
  }

  return $new_array;
}


// updation not preserved outside of foreach
$ar = update_array($soap_arr, $test_array);
print_r($ar);
person Alex Kapustin    schedule 30.01.2014