【问题标题】:Why my array does not sort correctly为什么我的数组没有正确排序
【发布时间】:2018-06-17 18:21:50
【问题描述】:

我有两个数组 $men, $sub ,我想用这个条件对它们进行排序:if($men["titre"] == $sub["menuParent"]) 我把包含 $sub["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 ["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"]))
        }

    }
}

结果:

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

我的错在哪里,如果有人可以向我解释为什么以及我是否采取了好的方法。

【问题讨论】:

    标签: php arrays sorting


    【解决方案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的代码,注意在设置数据时不再使用key,而是使用$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
    

    【讨论】:

    • 是的,我错过了 foreach 的 key,现在它可以工作了,但即使没有 $men 中的 & 它也可以工作,我不明白两者之间有什么区别?我添加了它,它也有效,但它在最后一个中添加了我&,就像这样:["menu3"] => &array(4) 这是什么意思?最后想:知道如何保存添加的键值而不是示例[0] => SubTitle3["submenu2"] => SubTitle3
    • 抱歉,可能有点混乱,我添加了一个使用 & 版本的代码版本。
    • 它工作正常,感谢您的时间即使$ 对我来说仍然有点模糊,但它可以工作。我在问自己为什么 $men['child'][$key] = ...&$men 一起使用但不是没有?如果我将$men['child'][$key] = 更改为$menu[$key]['child'][$key2] =,则$key=>$men 有效?
    猜你喜欢
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多