1

我以下兩個數組如下:如何在現有的關聯數組的內部鍵中創建新的數組鍵?

$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) { 

    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] => 
             ) 

           ) 
         ) 



       ) 

     ) 

) 

誰能幫助我在這方面嗎?提前致謝。

回答

1

Try it。創建新的數組,因爲我們可以重置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);