Php 创建自定义多维数组

Php 创建自定义多维数组,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我对此感到困惑了一段时间,想知道是否有办法将这些数据转换为自定义多维数组 我在我的表上运行一个查询,它会输出一个如下的数组 SELECT id_cms_category, name FROM cms_category_lang ORDER BY id_cms_category ASC array 0 => array 'id_cms' => string '4' (length=1) 'id_cms_category' => string '1' (length=1

我对此感到困惑了一段时间,想知道是否有办法将这些数据转换为自定义多维数组

我在我的表上运行一个查询,它会输出一个如下的数组

SELECT id_cms_category, name FROM cms_category_lang ORDER BY id_cms_category ASC
array
0 => 
array
  'id_cms' => string '4' (length=1)
  'id_cms_category' => string '1' (length=1)
  'meta_title' => string 'About us' (length=8)
 1 => 
array
  'id_cms' => string '6' (length=1)
  'id_cms_category' => string '1' (length=1)
  'meta_title' => string 'Contact Us' (length=10)
 2 => 
array
  'id_cms' => string '1' (length=1)
  'id_cms_category' => string '1' (length=1)
  'meta_title' => string 'Delivery' (length=8)
 3 => 
array
  'id_cms' => string '2' (length=1)
  'id_cms_category' => string '1' (length=1)
  'meta_title' => string 'Legal Notice' (length=12)
 4 => 
array
  'id_cms' => string '5' (length=1)
  'id_cms_category' => string '1' (length=1)
  'meta_title' => string 'Secure payment' (length=14)
 5 => 
array
  'id_cms' => string '3' (length=1)
  'id_cms_category' => string '1' (length=1)
  'meta_title' => string 'Terms and conditions of use' (length=27)
 6 => 
array
  'id_cms' => string '10' (length=2)
  'id_cms_category' => string '2' (length=1)
  'meta_title' => string 'FAQ - UltraTech IBC Spill Pallet Plus' (length=37)
 7 => 
array
  'id_cms' => string '9' (length=1)
  'id_cms_category' => string '2' (length=1)
  'meta_title' => string 'FAQ - UltraTech P2 Plus 2-Drum Hard Top Spill Pallet' (length=52)
 8 => 
array
  'id_cms' => string '7' (length=1)
  'id_cms_category' => string '2' (length=1)
  'meta_title' => string 'XR-5, Urethane & Copolymer 2000' (length=31)
foreach($title as $key => $value)
{
    <li>$value</li>
    foreach($value as $id_cms => $page)
    {
        <li><a href="$id_cms">$page</a></li>
    }
}
Home
  home 1
  home 2
  home 3
Test
  test 1
  test 2
  test 3
生成的数组如下所示

array
0=>
  array
  'id_cms_category'=> 1
  'name'=>'Home'
1=>
  array
  'id_cms_category'=> 2
  'name'=>'Test'
然后我在cms表上运行查询

SELECT cl.id_cms, c.id_cms_category, cl.meta_title 
FROM cms_lang cl
LEFT JOIN cms c ON (c.id_cms = cl.id_cms) 
LEFT JOIN cms_link ci ON (ci.id_cms = cl.id_cms)
ORDER BY c.id_cms_category, cl.meta_title ASC
我得到一个这样的数组

SELECT id_cms_category, name FROM cms_category_lang ORDER BY id_cms_category ASC
array
0 => 
array
  'id_cms' => string '4' (length=1)
  'id_cms_category' => string '1' (length=1)
  'meta_title' => string 'About us' (length=8)
 1 => 
array
  'id_cms' => string '6' (length=1)
  'id_cms_category' => string '1' (length=1)
  'meta_title' => string 'Contact Us' (length=10)
 2 => 
array
  'id_cms' => string '1' (length=1)
  'id_cms_category' => string '1' (length=1)
  'meta_title' => string 'Delivery' (length=8)
 3 => 
array
  'id_cms' => string '2' (length=1)
  'id_cms_category' => string '1' (length=1)
  'meta_title' => string 'Legal Notice' (length=12)
 4 => 
array
  'id_cms' => string '5' (length=1)
  'id_cms_category' => string '1' (length=1)
  'meta_title' => string 'Secure payment' (length=14)
 5 => 
array
  'id_cms' => string '3' (length=1)
  'id_cms_category' => string '1' (length=1)
  'meta_title' => string 'Terms and conditions of use' (length=27)
 6 => 
array
  'id_cms' => string '10' (length=2)
  'id_cms_category' => string '2' (length=1)
  'meta_title' => string 'FAQ - UltraTech IBC Spill Pallet Plus' (length=37)
 7 => 
array
  'id_cms' => string '9' (length=1)
  'id_cms_category' => string '2' (length=1)
  'meta_title' => string 'FAQ - UltraTech P2 Plus 2-Drum Hard Top Spill Pallet' (length=52)
 8 => 
array
  'id_cms' => string '7' (length=1)
  'id_cms_category' => string '2' (length=1)
  'meta_title' => string 'XR-5, Urethane & Copolymer 2000' (length=31)
foreach($title as $key => $value)
{
    <li>$value</li>
    foreach($value as $id_cms => $page)
    {
        <li><a href="$id_cms">$page</a></li>
    }
}
Home
  home 1
  home 2
  home 3
Test
  test 1
  test 2
  test 3
我想尝试获取所有这些数据,并以某种方式创建一个这样的多维数组

array
0 => 'Home'
        array
         id_cms => meta_title
1 => 'Test'
        array
         id_cms => meta_title
那样的话,我就可以做这样的事情了

SELECT id_cms_category, name FROM cms_category_lang ORDER BY id_cms_category ASC
array
0 => 
array
  'id_cms' => string '4' (length=1)
  'id_cms_category' => string '1' (length=1)
  'meta_title' => string 'About us' (length=8)
 1 => 
array
  'id_cms' => string '6' (length=1)
  'id_cms_category' => string '1' (length=1)
  'meta_title' => string 'Contact Us' (length=10)
 2 => 
array
  'id_cms' => string '1' (length=1)
  'id_cms_category' => string '1' (length=1)
  'meta_title' => string 'Delivery' (length=8)
 3 => 
array
  'id_cms' => string '2' (length=1)
  'id_cms_category' => string '1' (length=1)
  'meta_title' => string 'Legal Notice' (length=12)
 4 => 
array
  'id_cms' => string '5' (length=1)
  'id_cms_category' => string '1' (length=1)
  'meta_title' => string 'Secure payment' (length=14)
 5 => 
array
  'id_cms' => string '3' (length=1)
  'id_cms_category' => string '1' (length=1)
  'meta_title' => string 'Terms and conditions of use' (length=27)
 6 => 
array
  'id_cms' => string '10' (length=2)
  'id_cms_category' => string '2' (length=1)
  'meta_title' => string 'FAQ - UltraTech IBC Spill Pallet Plus' (length=37)
 7 => 
array
  'id_cms' => string '9' (length=1)
  'id_cms_category' => string '2' (length=1)
  'meta_title' => string 'FAQ - UltraTech P2 Plus 2-Drum Hard Top Spill Pallet' (length=52)
 8 => 
array
  'id_cms' => string '7' (length=1)
  'id_cms_category' => string '2' (length=1)
  'meta_title' => string 'XR-5, Urethane & Copolymer 2000' (length=31)
foreach($title as $key => $value)
{
    <li>$value</li>
    foreach($value as $id_cms => $page)
    {
        <li><a href="$id_cms">$page</a></li>
    }
}
Home
  home 1
  home 2
  home 3
Test
  test 1
  test 2
  test 3
  • 创建一个新的空数组:
    $newArray=array()
  • 使用foreach检查结果,然后在执行过程中,检查当前项目的类别是否已存在于新数组中:
    if(isset($newArray[$row['id\u cms\u category'))
  • 如果没有,则创建它并使用包含该项作为第一个元素的新数组对其进行初始化:
    $newArray[$row['id\u cms\u category']=array($row);
  • 如果它已经存在(即,您已经浏览了属于此类别的项目),则添加它:
    $newArray[$row['id\u cms\u category'][=$row;

  • 就是这样!

    如果你的CMS返回一个数字索引数组(这是你帖子中的声音),你可以使用你想要的任何键重新索引数组

    $array = array(0 => array('id_cms' => 4, 'id_cms_category' => 1, 'meta_title' => 'About us'));
    $newArray = array();
    foreach ( $array as $v ) {
        $newArray[$v['meta_title']] = $v;   
    }
    var_dump($newArray);
    

    数组在PHP编程中是至关重要的,所以在进一步研究之前,您最好先了解一下它们。

    我不会为此进行两次查询

    我将更改您的第二个查询,使您在同一个结果集中同时获得类别和页面名称。它应该类似于:

    SELECT cl.id_cms, c.id_cms_category, catlang.name, cl.meta_title 
    FROM cms_lang cl
    LEFT JOIN cms c 
         ON (c.id_cms = cl.id_cms) 
    LEFT JOIN cms_link ci 
         ON (ci.id_cms = cl.id_cms)
    LEFT JOIN cms_category_lang catlang 
         ON (catlang.id_cms_category = cl.id_cms_category)
    ORDER BY c.id_cms_category, catlang.name, cl.meta_title ASC;
    
    然后,您可以创建一个循环,只需在每次迭代中检查类别。如果它找到一个新的类别,请结束上一个块并开始一个新的类别:

    $currentCategory = '';
    $output = '';
    foreach ($rows as $row) {
        if ($currentCategory != $row['name']) {
            $output .= '</li><li>' . $row['name'];
        }
        $currentCategory = $row['name'];
        $output .= '<li><a href="' . $row['id_cms'] . '">' . $row['meta_title'] . '</li>';     
    }
    
    // Trim off our unnecessary </li>
    $output = substr($output, 4);
    
    $currentCategory='';
    $output='';
    foreach($行作为$行){
    如果($currentCategory!=$row['name'])){
    $output.='
  • '.$row['name']; } $currentCategory=$row['name']; $output.='
  • 。$row['meta_title'].
  • ; } //剪掉不必要的头发 $output=substr($output,4);
    您使用哪种获取方法来检索结果?@FabienWarniez这是使用电子商务平台Prestashop,他们使用PDO,在他们的DB类中,他们的对象被称为executeS,它执行sql查询,并使结果中的所有数据在多维数组中可用。我明白了。我的答案见下文。这是行不通的工作。当“id\u cms\u category”不是每个记录的唯一项时,为什么要使用它作为键?您如何知道代码使用$row?它不是每个记录的唯一项,确切地说,OP要做的是按类别对其记录进行分组。这就是为什么我使用id\u cms\u category作为键,并且该值是包含属于该类别的记录的数组血淋淋的。为什么是$row?因为它代表一条记录/行。当我说“检查结果”时,很容易理解你必须做一个foreach($result as$row),你可以用你想要的任何东西替换$result和$row…这只是一个变量名。让我们试试这个。请解释一下你的想法“$newArray[$row['id\u cms\u category']=]$row'Dos.$row['id\u cms\u category']是OP想要分组的类别,即“Home”,“Test”。该行添加$row作为数组的新对象,该数组包含类别“Home”的所有条目。例如,$array从何而来?它是一个定义为示例的PHP变量。其中包含静态内容?