为什么我的数组没有正确排序

时间:2018-06-17 18:21:51

标签: php arrays sorting

我有两个数组$men$sub,我想要用这个条件对它们进行排序:if($men["titre"] == $sub["menuParent"])我把第二个数组的内容包含$ sub [&#34} ; menuParent"]在第一个。

案例:

//Array1 ($menu)

array(3) {
  ["menu1"] => array(3) {
    ["titre"] => string(6) "Title2"
    ["lien"] => string(0) ""
    ["order"] => string(1) "2"
  }
  ["menu2"] => array(3) {
    ["titre"] => string(6) "Title3"
    ["lien"] => string(10) "google.com"
    ["order"] => string(1) "3"
  }
  ["menu3"] => array(3) {
    ["titre"] => string(6) "Title1"
    ["lien"] => string(0) ""
    ["order"] => string(1) "1"
  }
}

//Array2 ($submenu)

array(3) {
  ["submenu1"] => array(3) {
    ["titre"] => string(9) "SubTitle2"
    ["menuParent"] => string(6) "Title2"
    ["order"] => string(1) "2"
  }
  ["submenu2"] => array(3) {
    ["titre"] => string(9) "SubTitle3"
    ["menuParent"] => string(6) "Title2"
    ["order"] => string(1) "3"
  }
  ["submenu3"] => array(3) {
    ["titre"] => string(9) "SubTitle1"
    ["menuParent"] => string(6) "Title1"
    ["order"] => string(1) "1"
  }
}

这里的例子如下:

array1 ["menu1"]["titre"] => string(6) "Title2"

array2 ["submenu1"]["menuParent"] => string(6) "Title2"

现在["menu1"]["titre"]& ["submenu1"]["menuParent"]"Title2"是相同的,所以我推送:

["submenu1"] => array(3) {
    ["titre"] => string(9) "SubTitle2"
    ["menuParent"] => string(6) "Title2"
    ["order"] => string(1) "2"
}

在:

["menu1"] => array(3) {
    ["titre"] => string(6) "Title2"
    ["lien"] => string(0) ""
    ["order"] => string(1) "2"
  }
像这样的孩子:

array(3) {
  ["menu1"] => array(3) {
    ["titre"] => string(6) "Title2"
    ["lien"] => string(0) ""
    ["order"] => string(1) "2"
    ["child"] => array(3) {
      [0] => array(3) {
        ["titre"] => string(9) "SubTitle2"
        ["menuParent"] => string(6) "Title2"
        ["order"] => string(1) "2"
      }
  }

所以我为整个元素做了这一切。

这是我的尝试,但它会推送["menu2"]中的所有元素,而不是["submenu1"]["submenu2"] IN ["menu1"]["submenu3"] IN {{1} }

我的尝试:

["menu3"]

结果:

/*Injection submenu to Menu*/
foreach($menu as $men) {
    foreach($submenu as $sub) {
        if($men["titre"] == $sub["menuParent"]){
        $key = key($menu);
        $menu[$key]['child'][] = array($sub["titre"], $sub["menuParent"], $sub["order"]);
        //My array_push doesn't work also
        array_push($menu, array($sub["titre"], $sub["menuParent"], $sub["order"]))
        }

    }
}

如果我有错,如果有人能向我解释为什么以及我是否采取了良好的方式。

1 个答案:

答案 0 :(得分:1)

问题出在您选择密钥的位置,您可以使用foreach ( as $key->$value)方法获取每个项目的密钥(foreach使用它自己的数组副本等等从原始数组中选择密钥与当前数组不同。你也可以使用& $ men,&允许您更改原始数组元素而不是创建新条目并尝试将新元素推送到数组中...

foreach($menu as $key => $men) {
    foreach($submenu as $key1=>$sub) {
        if($men["titre"] == $sub["menuParent"]){
            $menu[$key]['child'][$key1] = array($sub["titre"], $sub["menuParent"], $sub["order"]);
        }

    }
}

...给出

Array
(
    [menu1] => Array
        (
            [titre] => Title2
            [lien] => 
            [order] => 2
            [child] => Array
                (
                    [submenu1] => Array
                        (
                            [0] => SubTitle2
                            [1] => Title2
                            [2] => 2
                        )

                    [submenu2] => Array
                        (
                            [0] => SubTitle3
                            [1] => Title2
                            [2] => 3
                        )

                )

        )

    [menu2] => Array
        (
            [titre] => Title3
            [lien] => google.com
            [order] => 3
        )

    [menu3] => Array
        (
            [titre] => Title1
            [lien] => 
            [order] => 1
            [child] => Array
                (
                    [submenu3] => Array
                        (
                            [0] => SubTitle1
                            [1] => Title1
                            [2] => 1
                        )

                )

        )

)

<强>更新

使用&$men的代码,请注意,在设置数据时,它不再使用密钥,而是使用$ men变量。

foreach($menu as &$men) {
    foreach($submenu as $key=>$sub) {
        if($men["titre"] == $sub["menuParent"]){
            $men['child'][$key] = array($sub["titre"], $sub["menuParent"], $sub["order"]);
        }
    }
}
unset($men);  // Good practice to ensure reference is reset