如何在PHP中的多维数组上模拟jQuery insertBefore appendTo etc
我有真正的问题让我的头围绕这一点,所以我希望我能充分解释它 我有一个元素数组,需要在不同的特定位置插入数组 所以我有这个(也可能有“prependTo”):- 我需要在其中插入:-如何在PHP中的多维数组上模拟jQuery insertBefore appendTo etc,php,arrays,sorting,Php,Arrays,Sorting,我有真正的问题让我的头围绕这一点,所以我希望我能充分解释它 我有一个元素数组,需要在不同的特定位置插入数组 所以我有这个(也可能有“prependTo”):- 我需要在其中插入:- $default_structure = Array ( [class:ics-page-holder] => Array ( [class:ics-full-side-1] => class:ics-full-side-1 [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
)
我已经尝试了我能找到的每个数组合并、数组合并递归等,但注意到这一顺序,所以我尝试迭代第二个数组,如果它的键与第一个数组中的值括号中的一个位匹配,则根据keys insertBefore/prependTo etc值插入第一个数组中的元素
但我无法解决如何将数组元素添加到第二个数组的特定位置,而不是每个(递归)块的末尾
真的希望有人能给我一些建议
更新这是我正在尝试的。。。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
)
)
有什么想法吗?好吧,我想我已经搞定了
首先要做的是更改$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\u icl\u structure\u reset\u els($default\u structure,$merged\u 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;
}
令人惊讶的是,睡个好觉是多么有帮助;)
剩下的唯一问题是,插入的元素内容本身可能是一个数组…嗯当您进行迭代和递归时,请确保使用引用。这样,当你对数组进行更改时,它会修改原始数据,而不是副本。请展示你迄今为止所做的尝试,你不能指望人们从头开始为你编写。是的,现在一切都很混乱,但很快就会编辑帖子
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;
}