Как создать новый ключ массива во внутреннем ключе существующего ассоциативного массива?
Я следую за двумя массивами следующим образом:
$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] =>
)
)
)
)
)
)
Может ли кто-нибудь помочь мне в этом отношении, пожалуйста? Заранее спасибо.
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);