Итак, я пытаюсь создать динамическую панель навигации, которая создается через элементы меню, хранящиеся в базе данных.Подсчет размера массива, внутри элемента массива - PHP
Каждому элементу меню присваивается parent_id, если этот идентификатор равен 0, этот элемент является родительским; если этот id является значением выше 0, то этот пункт меню является дочерним элементом другого элемента меню. (Представьте, что вы нависаете над пунктом меню навигации и получаете раскрывающийся список дочерних элементов)
Следующая функция - это то, что создает многомерный массив из записей в базе данных.
function build_menu($menu_id){
$mysqli = new mysqli("localhost", "user", "password", "db");
if($mysqli->connect_errno){
echo "Failed to connect to MySQL: " . $mysqli->connect_errno;
}
$stmt = $mysqli->prepare("SELECT `id`, `name`, `order`, `parent_id`, `path` FROM menu_items WHERE `group_id` = ? ORDER BY `order` ASC");
$menu_id = intval($mysqli->real_escape_string($menu_id));
$stmt->bind_param('i', $menu_id);
if($stmt->execute()){
$results = resultToArray($stmt->get_result());
$parents = array();
$children = array();
$menu = array();
for($i=0; $i<count($results); $i++){
if($results[$i]['parent_id'] === 0){
$parents[] = $results[$i];
} else {
$children[] = $results[$i];
}
}
for($i=0; $i<count($parents); $i++){
$menu[$i] = $parents[$i];
for($j=0; $j<count($children); $j++){
if($children[$j]['parent_id'] === $parents[$i]['id']){
$menu[$i][$j] = $children[$j];
}
}
}
return($menu);
} else {
echo "Failed to execute statement: " . $stmt->errno . ": " . $stmt->error;
}
$mysqli->close();
return(0);
}
Это функция, которая принимает этот массив и превращает его в HTML-код, который будет использоваться в качестве панели навигации.
function get_menu($menu_id) {
if(build_menu($menu_id)){
$menu = build_menu($menu_id);
$menu_html = '<ul>';
for($i=0; $i<count($menu); $i++){
$menu_item_path = ($menu[$i]['path'] != NULL ? $menu[$i]['path'] : '#');
$menu_html .= '<li><a href="' . $menu_item_path . '">' . $menu[$i]['name'] . '</a>';
if(count($menu[$i])>0){
$menu_html .= '<ul>';
for($j=0; $j<count($menu[$i]); $j++){
if(isset($menu[$i][$j])){
$menu_html .= '<li>' . $menu[$i][$j]['name'] . '</li>';
}
}
$menu_html .= '</ul>';
}
$menu_html .= '</li>';
}
$menu_html .= '</ul>';
return($menu_html);
}
}
я предположил, что if(count($menu[$i])>0)
будет считать количество элементов массива внутри выбранного элемента, но по какой-то причине, он считает ключи и, следовательно, всегда верно.
Я знаю, что это довольно длинный вопрос, я ценю тех из вас, кто зачитал это далеко. Если вы можете помочь мне выяснить, есть ли у элемента меню детские элементы, это было бы здорово.
Не могли бы вы объяснить немного больше? Я не понимаю. Я пытаюсь проверить, существует ли массив внутри элемента массива. –
Я нашел исправление. Вместо подсчета «sub-array», я просто проверил, действительно ли 'isset ($ menu [$ i] [0])' возвращает true, доказывая, что существует «подматрица». –