使用PHP对数组进行排序以生成多级菜单列表

时间:2017-07-12 01:12:28

标签: php mysql arrays sorting

我正在尝试在PHP中生成一个多级菜单列表,但我还没有怎么做,我想帮助我简单的例子,并用他们的标题对类别和子类别进行排序,如下所示:

<ul>
  <li>Category 1</li>
  <li>
    <h4>TITLE HERE</h4>
    <ul>
      <li>Category Child 1</li>
      <li>Category Child 2</li>
      <li>Category Child 3</li>
      <li>
        <h4>TITLE HERE</h4>
        <ul>
          <li>Category child 1</li>
          <li>Category child 2</li>
          <li>Category child 3</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Category 1</li>
  <li>Category 2</li>
  <li>Category 3</li>
</ul>

我在PHP中有一个数组:

$data = Array (
  '0' => Array (
      'id' => '1',
      'id_parent' => '',
      'name' => 'Sports'
  ),

  '1' => Array (
      'id' => '2',
      'id_parent' => '1',
      'name' => 'Football'
  ),

  '2' => Array (
      'id' => '3',
      'id_parent' => '1',
      'name' => 'Bascket'
  ),

  '3' => Array (
      'id' => '4',
      'id_parent' => '',
      'name' => 'Health'
  ),

  '4' => Array (
      'id' => '5', 
      'id_parent' => '4',
      'name' => 'Nutrition and diet'
  ),

  '5' => Array (
      'id' => '6',
      'id_parent' => '4',
      'name' => 'Beauty Salon'
  ),

  '6' => Array (
      'id' => '7',
      'id_parent' => '',
      'name' => 'Films'
  ),

  '7' => Array (
      'id' => '8',
      'id_parent' => '7',
      'name' => 'Armageddon'
  ),

  '8' => Array (
      'id' => '9',
      'id_parent' => '7',
      'name' => 'Apocalypse'
  ),

  '9' => Array (
      'id' => '10',
      'id_parent' => '',
      'name' => 'News'
  ),

  '10' => Array (
      'id' => '11',
      'id_parent' => '10',
      'name' => 'International'
  ),

  '11' => Array (
      'id' => '12',
      'id_parent' => '11',
      'name' => 'News from Syria'
  ),

  '12' => Array (
      'id' => '13',
      'id_parent' => '11',
      'name' => 'News from Palestine'
  )
);

我在MySQL中有一个表:

CREATE TABLE `categories` (
  `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  `id_parent` mediumint(8) unsigned DEFAULT NULL,
  `name` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `FK_categories_UNIQUE` (`name`),
  KEY `FK_categories` (`id_parent`),
  CONSTRAINT `FK_categories` FOREIGN KEY (`id_parent`) REFERENCES `categories` (`id`) ON UPDATE CASCADE
)   ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of categories
-- ----------------------------

INSERT INTO `categories` VALUES ('1', null, 'Sports');
INSERT INTO `categories` VALUES ('2', '1', 'Football');
INSERT INTO `categories` VALUES ('3', '1', 'Bascket');
INSERT INTO `categories` VALUES ('4', null, 'Health');
INSERT INTO `categories` VALUES ('5', '4', 'Nutrition and diet');
INSERT INTO `categories` VALUES ('6', '4', 'Beauty Salon');
INSERT INTO `categories` VALUES ('7', null, 'Films');
INSERT INTO `categories` VALUES ('8', '7', 'Armageddon');
INSERT INTO `categories` VALUES ('9', '7', 'Apocalypse');
INSERT INTO `categories` VALUES ('10', null, 'News');
INSERT INTO `categories` VALUES ('11', '10', 'International');
INSERT INTO `categories` VALUES ('12', '11', 'News from Syria');
INSERT INTO `categories` VALUES ('13', '11', 'News from Palestine');

1 个答案:

答案 0 :(得分:1)

我会帮助你,但我想首先说几件事情;

您的数据库设计不合适。如果您为每个元素提供 parent_id ,那么您应该为父母提供parent_id 0,或者在最佳情况下为最高父母提供null。这样我们就可以先减少foreach并自动获取主要类别。

也许现在你有很多价值,但将来你应该考虑这个。想想如果你有数以千计的新闻,类别,并且每次你必须遍历所有数据。

无论如何,这是你的代码

$parents = array();

foreach ($data as $key => $item) {
    if($item['id_parent'] === '') {
        $parents[$key] = $item;
    } 
}

?>

<ul>

<?php foreach ($parents as $parent) { ?>
     <li> <?php $parent['name'] ?> </li>
     <ul>
   <?php foreach ($data as $key => $item)  { ?>
        <?php if ($parent['id'] == $item['id_parent'])  { ?>
        <li> <?php $item['name'] ?> </li> 
        <?php } ?>
    <?php } ?>
    </ul> 
<?php } ?>

这是结果

enter image description here