кто-нибудь может помочь мне объединить эти две функции PHP? - PullRequest
0 голосов
/ 08 июня 2018

у меня есть эти две функции:

эта функция генерирует меню дерева ul из родительского mysql, parentid, title

while($row=mysqli_fetch_object($query)){
$data[$row->ParentId][] = $row;
}

function BuildTree($data, $parent = 0) {
static $i = 1;
//$tab = str_repeat('-', $i);
if ($data[$parent]) {
    $html .= "\n<ul" . ($parent == 0 ? ' class="tree"' : '') . ">\n";
    $i++;
    foreach ($data[$parent] as $v) {
        $child = BuildTree($data, $v->Parent);
        $html .= "<li>";
        $html .= '<span>' . $v->Title . "</span>";
        if ($child) {
            $i–;
            $html .= $child;
        }
        $html .= "</li>\n";
    }
    $html .= "</ul>\n";
    return $html;
} else {
    return false;
}
}

echo (BuildTree($data));

оно генерирует меню, подобное:

категория A
-подкатегория категории A
- подкатегория A подкатегории A
категория B
...... бесконечно ...

и эта функцияполучить ключи массива

function GetKeys($array, $tree = array()) {
foreach ($array as $key => $value) {
    if (is_array($value)) {
        GetKeys($value, array_merge($tree, array($key)));
    } else {
        print implode('.', array_merge($tree, array($key, $value)));
        print "\n<br />";
    }
}
}

GetKeys($data);

он получает ключи типа

0
01
001
020
для каждого дочернего элемента меню

но я не знаю, как объединить это, чтобы получить что-то вроде:

категория A [0]
-подкатегория категории A [00]
- подкатегория A подкатегорииA [000]
- подкатегория B категории A [001]
категория B 1
бесконечно ...

Может кто-нибудь помочь мне с этой проблемойу меня есть?

$ var_dump $ data get:

структура массива

полный код

РЕШЕНИЕ:

function BuildTree($data, $parent = 0, $k=false) {
static $i = 1;
if ($data[$parent]) {
$html .= "\n<ul" . ($parent == 0 ? ' class="tree"' : '') . ">\n";
$i++;
foreach ($data[$parent] as $key => $v) {
$child = BuildTree($data, $v->Parent, $k.$key);
$html .= "<li>[" . $k.$key . ']';
$html .= '<span>' . $v->Title . "</span>";
if ($child) {
    $i–;
    $html .= $child;
}
$html .= "</li>\n";
}
$html .= "</ul>\n";
return $html;
} else {
return false;
}
}

echo (BuildTree($data));

людей, которые в этом помогают:

выключатель
Амр Бераг

СПАСИБО!

1 Ответ

0 голосов
/ 08 июня 2018

Измените вашу функцию Getkeys, чтобы она возвращала отсортированный массив ключей, затем сделайте его глобальным и получите к нему доступ из вашей функции BuildTree () и каждый раз добавляйте первый элемент в ключи перед закрытием li и немедленно удаляйте его, используя unset.концепция состоит в том, чтобы думать о дереве как о линейной вещи.Вот моя попытка:

$g_keys = array();
function GetKeys($array, $tree = array()) {
global $g_keys;//global
foreach ($array as $key => $value) {
    if (is_array($value)) {
        GetKeys($value, array_merge($tree, array($key)));
    } else {
        $k = implode('.', array_merge($tree, array($key, $value)));
        $g_keys[]=$k;
    }
}

}


function BuildTree($data, $parent = 0) {

 global $g_keys;//global


static $i = 1;
//$tab = str_repeat('-', $i);
if ($data[$parent]) {
    $html .= "\n<ul" . ($parent == 0 ? ' class="tree"' : '') . ">\n";
    $i++;
    foreach ($data[$parent] as $v) {
        $child = BuildTree($data, $v->Parent);
        $html .= "<li>";
        $html .= '<span>' . $v->Title . "</span>";
        if ($child) {
            $i–;
            $html .= $child;
        }
        $html .="[".array_shift($g_keys)."]</li>\n";
    }
    $html .= "</ul>\n";
    return $html;
} else {
    return false;
}
}


  //Now use it 

GetKeys($data);// $g_keys is a global that can be accessed from both functions now
echo (BuildTree($data));

.............................

array_shift ()
Я впервые использую эту функцию.это то, что документы об этом говорят (если это не работает, попробуйте сделать это вручную)

array_shift () сдвигает первое значение массива и возвращает его, сокращая массив наодин элемент и все движется вниз.Все ключи числового массива будут изменены, чтобы начать отсчет с нуля, в то время как буквальные ключи не будут затронуты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...