如何在PHP中的多维数组上模拟jQuery insertBefore appendTo etc

如何在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]

我有真正的问题让我的头围绕这一点,所以我希望我能充分解释它

我有一个元素数组,需要在不同的特定位置插入数组

所以我有这个(也可能有“prependTo”):-

我需要在其中插入:-

$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;
}