我遇到了真正的问题,所以我希望能够充分解释这个问题!
我有一系列元素需要在不同的特定位置插入数组。
所以我有这个(也可能有'prependTo'): -
$merged_movers = Array(
[class:ics-header] => insertBefore(class:ics-page-holder)
[class:ics-secondary] => insertAfter(class:ics-primary)
[class:ics-footer] => appendTo(class:ics-page)
[class:ics-full-side-2] => insertBefore(class:ics-page)
)
我需要插入: -
$default_structure = Array
(
[class:ics-page-holder] => Array
(
[class:ics-full-side-1] => class:ics-full-side-1
[class:ics-page] => Array
(
[class:ics-topblock] => class:ics-topblock
[class:ics-main] => Array
(
[class:ics-main-top] => class:ics-main-top
[class:ics-primary] => Array
(
[class:ics-primary-top] => class:ics-primary-top
[class:ics-article] => class:ics-article
[class:ics-article2] => class:ics-article2
[class:ics-primary-bottom] => class:ics-primary-bottom
)
[class:ics-tertiary] => class:ics-tertiary
[class:ics-main-bottom] => class:ics-main-bottom
)
[class:ics-bottomblock] => class:ics-bottomblock
)
)
)
我需要最终得到: -
[class:ics-header] => class:ics-header
[class:ics-page-holder] => Array
(
[class:ics-full-side-1] => class:ics-full-side-1
[class:ics-full-side-2] => class:ics-full-side-2
[class:ics-page] => Array
(
[class:ics-topblock] => class:ics-topblock
[class:ics-main] => Array
(
[class:ics-main-top] => class:ics-main-top
[class:ics-primary] => Array
(
[class:ics-primary-top] => class:ics-primary-top
[class:ics-article] => class:ics-article
[class:ics-article2] => class:ics-article2
[class:ics-primary-bottom] => class:ics-primary-bottom
)
[class:ics-secondary] => class:ics-secondary
[class:ics-tertiary] => class:ics-tertiary
[class:ics-main-bottom] => class:ics-main-bottom
)
[class:ics-bottomblock] => class:ics-bottomblock
)
[class:ics-footer] => class:ics-footer
)
我已经尝试了每个array_merge,array_merge递归等我可以找到但是注意到了我的顺序所以我想要做的是遍历第二个数组并且如果它的键与第一个值中括号中的一个位匹配数组根据键insertBefore / prependTo等值插入第一个数组中的元素。
但我无法弄清楚如何在某些位置将数组元素添加到第二个数组中,而不是在每个(递归)块的末尾...
真的希望有人能给我一些指示......
UPDATE这就是我正在尝试的... insertBefore和appendTo似乎工作正常但是insertAfter正在追加,我无法弄清楚如何阻止它(不确定prepedTo
$new_default_structure = $default_structure;
foreach($merged_movers as $el => $pos_settings)
{
$pos_setting = explode('(',rtrim($pos_settings, ')'));
$position = $pos_setting[0];
$position_relation = $pos_setting[1];
parse_icl_structure_reset_els(&$new_default_structure, $el, $el_content[$el], $position, $position_relation);
}
称之为: -
function parse_icl_structure_reset_els(&$default_structure, $el, $el_content, $position, $position_relation, &$insertbefore='', &$insertafter='') {
if($insertbefore != '')
{
foreach($insertbefore as $key2 => $value2)
$default_structure[$key2] = $value2;
$insertbefore = '';
}
foreach($default_structure as $key => &$value)
{
if($key == $position_relation)
{
if($position == 'insertBefore')//this might be working
{
$holdingkey = $value;
unset($default_structure[$key]);
$default_structure[$el.'insertBefore'] = $el_content;
$default_structure[$key] = $value;
if(is_array($value))
parse_icl_structure_reset_els(&$value, $el, $el_content, $position, $position_relation, &$insertbefore, &$insertafter);
}
if($position == 'insertAfter')//this seems to do what I want appendTo to do
{
if(is_array($value))
parse_icl_structure_reset_els(&$value, $el, $el_content, $position, $position_relation, &$insertbefore, &$insertafter);
else
$value[$key] = $value;
$value[$el.'insertAfter'] = $el_content;
}
if($position == 'appendTo')
{
if(is_array($value))
parse_icl_structure_reset_els(&$value, $el, $el_content, $position, $position_relation, &$insertbefore, &$insertafter);
else
$value[$key] = $value;
$value[$el.'appendTo'] = $el_content;
}
}
elseif(is_array($value))
{
parse_icl_structure_reset_els(&$value, $el, $el_content, $position, $position_relation, &$insertbefore, &$insertafter);
}
}
}
这给了我这个
[class:ics-headerinsertBefore] => class:ics-header
[class:ics-page-holder] => Array
(
[class:ics-full-side-1] => class:ics-full-side-1
[class:ics-full-side-2insertBefore] => class:ics-full-side-2
[class:ics-page] => Array
(
[class:ics-topblock] => class:ics-topblock
[class:ics-main] => Array
(
[class:ics-main-top] => class:ics-main-top
[class:ics-primary] => Array
(
[class:ics-primary-top] => class:ics-primary-top
[class:ics-article] => class:ics-article
[class:ics-article2] => class:ics-article2
[class:ics-primary-bottom] => class:ics-primary-bottom
[class:ics-secondaryinsertAfter] => class:ics-secondary
)
[class:ics-tertiary] => class:ics-tertiary
[class:ics-main-bottom] => class:ics-main-bottom
)
[class:ics-bottomblock] => class:ics-bottomblock
[class:ics-footerappendTo] => class:ics-footer
)
)
有什么想法吗?
答案 0 :(得分:0)
好吧我想破解了它!
要做的第一件事是更改$ merged_movers数组的结构,以便键是已经在默认结构数组中的元素...
foreach($merged_movers as $move_el => $pos_settings)
{
$pos_setting = explode('(',rtrim($pos_settings, ')'));
$position = $pos_setting[0];
$target = $pos_setting[1];
$new_merged_movers[$target][$move_el] = $position;
}
$merged_movers = $new_merged_movers;
所以现在这个数组看起来像这样
[class:ics-page-holder] => Array
(
[class:ics-header] => insertBefore
)
[class:ics-primary] => Array
(
[class:ics-secondary] => insertAfter
)
[class:ics-page] => Array
(
[class:ics-footer] => appendTo
[class:ics-full-side-2] => insertBefore
)
然后我调用$ structureOut = parse_icl_structure_reset_els($ default_structure,$ merged_movers,$ prependTo ='',$ appendTo ='');
这是这个功能
function parse_icl_structure_reset_els($default_structure, $merged_movers, $prependTo='', $appendTo='') {
if(is_array($prependTo))
{
foreach($prependTo as $el => $val)
{
$newStructure[$el] = $el;
}
$prependTo = '';
}
foreach($default_structure as $key => $value)
{
if(array_key_exists($key,$merged_movers))
{
foreach($merged_movers[$key] as $el => $pos)
{
if($pos == 'insertBefore')
{
$newStructure[$el] = $el;
}
elseif($pos == 'prependTo' || $pos == 'appendTo')
{
if($pos == 'prependTo')
{
$prependTo[$el] = $key;
}
if($pos == 'appendTo')
{
$appendTo[$el] = $key;
}
}
}
}
if(is_array($value))
{
$this_content_array = parse_icl_structure_reset_els($value, $merged_movers, $prependTo, $appendTo);
if(is_array($prependTo))
{
foreach($prependTo as $el => $val)
{
if($val == $key)
{
$out_content_array[$el] = $el;
$out_modified = true;
unset($prependTo[$el]);
}
}
if($out_modified == true)
{
foreach($this_content_array as $pkey => $pvalue)
{
$out_content_array[$pkey] = $pvalue;
}
$this_content_array = $out_content_array;
$out_modified = false;
}
}
if(is_array($appendTo))
{
foreach($appendTo as $el => $val)
{
if($val == $key)
{
$this_content_array[$el] = $el;
unset($appendTo[$el]);
}
}
}
$newStructure[$key] = $this_content_array;
}
else
{
$newStructure[$key] = $value;
}
if(array_key_exists($key,$merged_movers))
{
foreach($merged_movers[$key] as $el => $pos)
{
if($pos == 'insertAfter')
{
$newStructure[$el] = $el;
}
}
}
}
return $newStructure;
}
令人惊讶的是,晚上可以睡个好觉;)
唯一的问题是插入的元素内容本身可能是一个数组......嗯