Я хотел бы рекурсивно получить доступ к полю id и libelle для заполнения моей базы данных. Я попробовал следующий скрипт: я заполняю только первый уровень id и libelle. (Где idTypeCaategorie = 0). Это всего лишь часть моего массива.
Я хочу заполнить только два поля в моей таблице данных «menu1» = «libelle» и «id» = id, и для каждого подвыборки libelle было бы здорово связать родительскую libelle с дочерней libelle. –
мое datatable stucure:
столбцы структуры >>>>> id (int (10) | newspaper_index (= 8) | menu_level (int) | menu1 ( ) | menu2 ( ) | menu3 ( ) | menu4 ( ) | menu5 ( ) | menu6 ( ) | menu7 (*) |; его меню menu1 – это libelle первого уровня, а menu2 – menu7 – дети libelle
пример 1: Univers Bebe (menu1) (id: …..) menu_level = 1
пример 2: Univers Bebe (menu1)> Lait et cereale (menu2) (id: ….) menu_level = 2
пример 3: Univers Bebe (menu1)> Lait et cereale (menu2)> lait 1er age (menu3) (id: …..) menu_level = 3
* = varchar Я хочу поместить информацию из массива в мою базу данных с помощью этой выше структуры Пример Массив:
массив ( [0] => Массив ( [id] => 288 [libelle] => Univers Bà © bà © [idTypeCategorie] => 0 [nomImage] => 1905.jpg [ponderation] => 1 [fils] => Массив ( [0] => Массив ( [id] => 2228 [libelle] => Laits & cà © rà © ales [idTypeCategorie] => 1 [nomImage] => 2002.png [ponderation] => 1 [mea] => 2067 [fils] => Массив ( [0] => Массив ( [id] => 1024 [libelle] => Lait 1er à ¢ ge [idTypeCategorie] => 2 [nomImage] => [ponderation] => 1 [nbProduits] => 9 [fils] => Массив ( ) ) [1] => Массив ( [id] => 1025 [libelle] => Lait 2Úme à ¢ ge [idTypeCategorie] => 2 [nomImage] => [ponderation] => 2 [nbProduits] => 10 [fils] => Массив ( ) ) [2] => Массив ( [id] => 1026 [libelle] => Круассаны [idTypeCategorie] => 2 [nomImage] => [ponderation] => 3 [nbProduits] => 19 [fils] => Массив ( ) ) [3] => Массив ( [id] => 290 [libelle] => Petit dà © jeuner [idTypeCategorie] => 2 [nomImage] => [ponderation] => 4 [nbProduits] => 9 [fils] => Массив ( ) ) [4] => Массив ( [id] => 2595 [libelle] => Cà © rà © ale [idTypeCategorie] => 2 [nomImage] => [ponderation] => 5 [nbProduits] => 10 [fils] => Массив ( ) ) ) ) [1] => Массив ( [id] => 2230 [libelle] => Repas de Bà © bà © [idTypeCategorie] => 1 [nomImage] => 1974.png [ponderation] => 2 [mea] => 2482 [fils] => Массив ( [0] => Массив ( [id] => 3651 [libelle] => Репас à base de là © gumes [idTypeCategorie] => 2 [nomImage] => [ponderation] => 3 [nbProduits] => 28 [fils] => Массив ( ) ) [1] => Массив ( [id] => 3656 [libelle] => Puré e pour bà © bà © [idTypeCategorie] => 2 [nomImage] => [ponderation] => 4 [nbProduits] => 8 [fils] => Массив ( ) ) [2] => Массив ( [id] => 3652 [libelle] => Репас à base de viande [idTypeCategorie] => 2 [nomImage] => [ponderation] => 5 [nbProduits] => 29 [fils] => Массив ( ) ) [3] => Массив ( [id] => 3653 [libelle] => Репас à base de poisson [idTypeCategorie] => 2 [nomImage] => [ponderation] => 6 [nbProduits] => 16 [fils] => Массив ( ) ) [4] => Массив ( [id] => 3654 [libelle] => Репас à base de volaille [idTypeCategorie] => 2 [nomImage] => [ponderation] => 7 [nbProduits] => 18 [fils] => Массив ( ) ) [5] => Массив ( [id] => 3657 [libelle] => Repas BIO [idTypeCategorie] => 2 [nomImage] => [ponderation] => 8 [nbProduits] => 4 [fils] => Массив ( ) ) ) ) [2] => Массив ( [id] => 3660 [libelle] => Diner & Soupe [idTypeCategorie] => 1 [nomImage] => 1989.png [ponderation] => 3 [mea] => 3764 [fils] => Массив ( [0] => Массив ( [id] => 3661 [libelle] => Pour le diner [idTypeCategorie] => 2 [nomImage] => [ponderation] => 1 [nbProduits] => 16 [fils] => Массив ( ) ) [1] => Массив ( [id] => 3662 [libelle] => Soupe pour bà © bà © [idTypeCategorie] => 2 [nomImage] => [ponderation] => 2 [nbProduits] => 9 [fils] => Массив ( ) ) ) ) [3] => Массив ( [id] => 2227 [libelle] => Горец и десерты [idTypeCategorie] => 1 [nomImage] => 2003.png [ponderation] => 4 [mea] => 309 [fils] => Массив ( [0] => Массив ( [id] => 294 [libelle] => Jus de fruits [idTypeCategorie] => 2 [nomImage] => [ponderation] => 1 [nbProduits] => 1 [fils] => Массив ( ) ) [1] => Массив ( [id] => 1021 [libelle] => Puré e de fruits [idTypeCategorie] => 2 [nomImage] => [ponderation] => 2 [nbProduits] => 26 [fils] => Массив ( ) ) [2] => Массив ( [id] => 3663 [libelle] => Компот [idTypeCategorie] => 2 [nomImage] => [ponderation] => 3 [nbProduits] => 18 [fils] => Массив ( ) ) [3] => Массив ( [id] => 1023 [libelle] => Бисквит [idTypeCategorie] => 2 [nomImage] => [ponderation] => 4 [nbProduits] => 3 [fils] => Массив ( ) ) [4] => Массив ( [id] => 1022 [libelle] => Yaourt pour bà © bà © [idTypeCategorie] => 2 [nomImage] => [ponderation] => 5 [nbProduits] => 8 [fils] => Массив ( ) ) [5] => Массив ( [id] => 3664 [libelle] => Десерт CrÚme [idTypeCategorie] => 2 [nomImage] => [ponderation] => 6 [nbProduits] => 11 [fils] => Массив ( ) ) ) ) [4] => Массив ( [id] => 295 [libelle] => Кушетообразные [idTypeCategorie] => 1 [nomImage] => 2029.png [ponderation] => 5 [mea] => 1713 [fils] => Массив ( [0] => Массив ( [id] => 2576 [libelle] => 3 - 6 кг [idTypeCategorie] => 2 [nomImage] => [ponderation] => 1 [nbProduits] => 7 [fils] => Массив ( ) ) [1] => Массив ( [id] => 308 [libelle] => 2 - 9 кг [idTypeCategorie] => 2 [nomImage] => [ponderation] => 2 [nbProduits] => 6 [fils] => Массив ( ) ) [2] => Массив ( [id] => 309 [libelle] => 7 - 18 Kg [idTypeCategorie] => 2 [nomImage] => [ponderation] => 3 [nbProduits] => 10 [fils] => Массив ( ) ) [3] => Массив ( [id] => 310 [libelle] => 9 - 25 Kg [idTypeCategorie] => 2 [nomImage] => [ponderation] => 4 [nbProduits] => 13 [fils] => Массив ( ) ) [4] => Массив ( [id] => 311 [libelle] => Кулонеты [idTypeCategorie] => 2 [nomImage] => [ponderation] => 6 [nbProduits] => 10 [fils] => Массив ( ) ) [5] => Массив ( [id] => 3829 [libelle] => Лингетки [idTypeCategorie] => 2 [nomImage] => [ponderation] => 7 [nbProduits] => 18 [fils] => Массив ( ) ) ) ) [5] => Массив ( [id] => 296 [libelle] => Туалетная вода [idTypeCategorie] => 1 [nomImage] => 2031.png [ponderation] => 6 [mea] => 968 [fils] => Массив ( [0] => Массив ( [id] => 312 [libelle] => Лингетки [idTypeCategorie] => 2 [nomImage] => [ponderation] => 1 [nbProduits] => 18 [fils] => Массив ( ) ) [1] => Массив ( [id] => 313 [libelle] => Savons & gels lavants [idTypeCategorie] => 2 [nomImage] => [ponderation] => 3 [nbProduits] => 7 [fils] => Массив ( ) ) [2] => Массив ( [id] => 314 [libelle] => Autres соглашается [idTypeCategorie] => 2 [nomImage] => [ponderation] => 5 [nbProduits] => 6 [fils] => Массив ( ) ) [3] => Массив ( [id] => 4183 [libelle] => Coton pour bà © bà © [idTypeCategorie] => 2 [nomImage] => [ponderation] => 6 [nbProduits] => 4 [fils] => Массив ( ) ) ) ) [6] => Массив ( [id] => 2229 [libelle] => Puà © riculture [idTypeCategorie] => 1 [nomImage] => 2030.png [ponderation] => 7 [mea] => 36176 [fils] => Массив ( [0] => Массив ( [id] => 2732 [libelle] => HygiÚne et bain pour bà © bà © [idTypeCategorie] => 2 [nomImage] => [ponderation] => 7 [nbProduits] => 2 [fils] => Массив ( ) ) ) ) ) ) [1] => Массив ( [id] => 2214 [libelle] => Fruits & là © gumes [idTypeCategorie] => 0 [nomImage] => 1916.png [ponderation] => 2 [fils] => Массив ( [0] => Массив ( [id] => 1136 [libelle] => Фрукты [idTypeCategorie] => 1 [nomImage] => 1928.png [ponderation] => 1 [mea] => 202 [fils] => Массив ( [0] => Массив ( [id] => 1139 [libelle] => Pommes & Poires [idTypeCategorie] => 2 [nomImage] => [ponderation] => 1 [nbProduits] => 5 [fils] => Массив ( ) ) [1] => Массив ( [id] => 1137 [libelle] => Арумес [idTypeCategorie] => 2 [nomImage] => [ponderation] => 2 [nbProduits] => 3 [fils] => Массив ( ) )
for($i=0; $i< $nb_elem ; $i++){ // while we're not at the end of big array foreach($tab_categories as $key => $objet){//for each element(objet) which has menu and foreach menu we fill database with id and libelle $id = $tab_categories[$i] -> id; $menu1 = utf8_decode($tab_categories[$i] -> libelle); //echo $id."|".$menu1."\n"; $req="INSERT IGNORE INTO menu_itm (id, menu1) VALUES('".$id."','".addslashes($menu1)."');"; //addslashes permet de gérer les caractère spéciaux $req=$bd->prepare($req); $req->execute(); } }
Я попробовал это:
function pour_un_objet ($ obj) {
foreach ($ obj -> Object as $ cle => $ array) {// … if (is_array ($ array) && count ($ array)> 0) {// si le champ de l'objet courant est un tableau et si ce dernier n'est pas vide pour_un_fils ($ array); return true; // fils exploitable} else return false; // fils un exploitable,
}
function pour_un_fils ($ input) {array_walk_recursive ($ input, function ($ input) {// для каждого термина – таблица, в то время как мы не находимся в конце таблицы, как только найдем метку и идентификатор
для ($ ср = 0; $ ср
foreach($input as $subkey ){// input is an array son subkey is his field (id, libelle ... ) if($subkey=="libelle" || $subkey=="id") get_menu($id,$term);// only if you arrive on a field or libelle id return true; } else return false; } }
} Любая помощь большая оценка.
Это схема того, что вы должны делать:
function ParseArray(array){ foreach (array as $item) { sql statement if($item->fils != null) ParseArray($item->fils) } }
Хорошо, просто написал этот класс, похоже, работает с включенными тестовыми данными.
<?php class recursiveGrab{ public $output; public $target; public $input; private $tempSub = array(); public function __construct ($subject, $target){ $this->input = $subject; $this->masterData = $subject; $this->target = $target; $this->getTopLevel(); } private function getTopLevel($level = null){ ($level == null) ? $dataset =$this->input : $dataset = $level; $target = $this->target; $i = 0; foreach($dataset as $key=>$value){ foreach($target as $k=>$needle){ if($key == $needle && !is_array($value)){$this->tempSub[$needle]= $value;}; } } if(count($this->tempSub) >= 1 ){ $this->output[] = $this->tempSub; } if(is_array($value) && count($value) >= 1){ $this->downLevel($value); } } private function downLevel($value){ $this->getTopLevel($value); } } //testData $tst = array('staff' => array( 'id'=>'1', 'name'=>'Director', 'subordinates'=>array( 'id'=>'2', 'name'=>'upperManagement', 'subordinates'=>array( 'id'=>'3', 'name'=>'Office Manager', 'subordinates'=>array( 'id'=>'4', 'name'=>'office staff', 'subordinates'=>array( ), array( 'id'=>'5', 'name'=>'it manager', 'subordinates'=>array() ) ) ) ) ) ); $mapped = new recursiveGrab($tst, array('id', 'name')); $twoD = $mapped->output; $values = ""; $rec = count($twoD); for($i=0;$i<$rec;$i++){ $values .=" (?,?)"; } $sql = "INSERT INTO myDB (id, name) VALUES".$values; echo $sql."<br>"; $counter = 1; foreach ($twoD as $row){ echo "\$stmt->bindParam({$counter}, {$row['id']}, PDO::PARAM_INT)<br>"; $counter++; echo "\$stmt->bindParam({$counter}, {$row['name']}, PDO::PARAM_STR)<br>"; $counter++; } ?>
Выходные данные следующие:
INSERT INTO myDB (id, name) VALUES (?,?) (?,?) (?,?) (?,?) (?,?) $stmt->bindParam(1, 1, PDO::PARAM_INT) $stmt->bindParam(2, Director, PDO::PARAM_STR) $stmt->bindParam(3, 2, PDO::PARAM_INT) $stmt->bindParam(4, upperManagement, PDO::PARAM_STR) $stmt->bindParam(5, 3, PDO::PARAM_INT) $stmt->bindParam(6, Office Manager, PDO::PARAM_STR) $stmt->bindParam(7, 4, PDO::PARAM_INT) $stmt->bindParam(8, office staff, PDO::PARAM_STR) $stmt->bindParam(9, 5, PDO::PARAM_INT) $stmt->bindParam(10, it manager, PDO::PARAM_STR)
Рекурсивная прогулка существующего многодорожечного дерева.
Протестировано в версии PHP 5.3.29 и более поздних версиях.
Код:
Работает с «деревом» как с массивом, а не stdClass
объектами stdClass
.
Добавлен скрипт 'build menu from database'.
Он использует функции, а не классы, но был организован в отдельные файлы.
Источник:
Таблица базы данных q29792309 DDL
Создайте меню из базы данных: Q29792309-index-build-tree-from-database.php
Чтобы сделать «древовидную прогулку» полезной, мы будем называть ее функцией «закрытия», которая имеет следующую сигнатуру:
function ($childNode, $parentNode);
Код:
Функция, которая выполняет работу по «хождению» по дереву:
/** * Apply processing to the current node and it's parent node. * * @param node $currentNode * @param node $parentNode * @param closure $processNode * @return void This is all 'side effects' */ function walkTree($currentNode, $parentNode, /* closure */ $processNode) { // call the closure - but only if the parent is set... if (!empty($parentNode)) { $processNode($currentNode, $parentNode); } // process the children of this node foreach ($currentNode['fils'] as $childNode) { walkTree($childNode, $currentNode, $processNode); // recurse for every node } return; }
Пример «закрытия» для вставки узла меню в базу данных:
/* -------------------------------------------------------------------------- * Closure to be called for every node with a parent in the tree * * It will insert the data into the database using a prepared query */ $processNode = function ($childNode, $parentNode) { insertMenuItem($parentNode['id'], $childNode['id'], $childNode['libelle']); };
Как использовать процедуры
1) Создать глобальную базу данных mysqli
connection
$DB_HOST = "localhost"; $DB_USER = "test"; $DB_PASSWORD = "test"; $DB_TO_USE = "testmysql"; $db = new mysqli($DB_HOST, $DB_USER, $DB_PASSWORD, $DB_TO_USE);
2) Включить / Определить процедуры обработки дерева
/** ----------------------------------------------------------------- * Tree Process Functions... * * function walkTree($currentNode, $parentNode, $processNode); */ include __DIR__ .'/Q29792309-tree-walk.php'; /* -------------------------------------------------------------------------- * Closure to be called for every node with a parent in the tree * * It will insert the data into the database using a prepared query */ $processNode = function ($childNode, $parentNode) { insertMenuItem($parentNode['id'], $childNode['id'], $childNode['libelle']); };
3) Включить процедуры обработки базы данных
/** ----------------------------------------------------------------- * Query functions... */ /** * function selectMenuList($whereClause = '', $valueList = array(), $orderBy = '') */ // example: $rows = selectMenuList('menu_id = ? OR parent_menu_id = ?', array(1024, 2229)); /** * displayMenuList($rows); */ include __DIR__ .'/Q29792309-select-query.php'; /** * function insertMenuItem($parentMenuId, $menuId, $title) */ include __DIR__ .'/Q29792309-insert-query.php'; /** * function updateMenuItem($parentMenuId, $menuId, $title) */ include __DIR__ .'/Q29792309-update-query.php'; /** * function truncateTable($tableName = 'q29792309') */ include __DIR__ .'/Q29792309-truncate-table.php';
4) Обработать дерево
/* ------------------------------------------------------------------- * Process all the data */ // ------ Load the JSON data $json = file_get_contents('Q29792309_json.txt'); $sourceTree = json_decode($json, true); // show test data... echo $EOL, ' -------- Source Tree Start ---------'; echo '<pre>'; print_r($sourceTree); echo '</pre>'; echo $EOL, ' -------- Source Tree End ---------'; // Empty the table... truncateTable('q29792309'); echo $EOL, ' -------- Tree walk Start ---------'; walkTree($sourceTree, null, $processNode); echo $EOL, ' -------- Tree walk End ---------'; // display the inserted rows $rows = selectMenuList(); displayMenuList($rows); exit(); // redundant but a clue when reading where the main processing ends
Примеры тестовых данных:
Array ( [id] => 0 [libelle] => Root [idTypeCategorie] => [nomImage] => [ponderation] => [fils] => Array ( [0] => Array ( [id] => 288 [libelle] => Parent: 0 to here: 288 [idTypeCategorie] => 0 [nomImage] => 1905.jpg [ponderation] => 1 [fils] => Array ( ...
Выход: введенные данные
-------- select rows Start --------- Parent Menu Id: 0 Menu Id: 288 Title: Parent: 0 to here: 288 isDeleted: 0 Parent Menu Id: 0 Menu Id: 289 Title: Parent: 0 to here: 289 isDeleted: 0 Parent Menu Id: 288 Menu Id: 2228 Title: Parent 288 to here: 2228 isDeleted: 0 Parent Menu Id: 288 Menu Id: 2229 Title: Parent 288 to here: 2229 isDeleted: 0 Parent Menu Id: 2228 Menu Id: 1024 Title: Parent 2228 to here: 1024 isDeleted: 0 Parent Menu Id: 2228 Menu Id: 1025 Title: Parent 2228 to here: 1025 isDeleted: 0 Parent Menu Id: 2229 Menu Id: 1036 Title: Parent 2229 to here: 1036 isDeleted: 0 -------- select rows End --------- -------- select rows End ---------
Это сделано, я нашел другой способ получить данные, которые я хотел.
function RecursiveAddOfProducts($listeSon,$listParents_libelle) { $result = array();$Product=array(); if($listeSon) { foreach($listSon as $key => $currentNode { if(!empty($currentNode)) { // If the product has a son $newParent_libelle = $listParents_libelle; $newParent_libelle[] = utf8_decode($currentNode['libelle']); $newParent_id=$listParents_id; $newParent_id[] = $currentNode['id']; $produit=array_merge($newParent_id,$newParent_libelle); $menu_niveau=count($Product)-1; ProductInsert($Product,$menu_niveau); RecursiveAddOfProducts($currentNode['fils'], $newParent_libelle); } } }
} $ listeParents = array ();
RecursiveAddOfProducts($tab_categories,$listParents);
Моя функция вставки работает так:
function ProductInsert($tab,$menu_niveau){ $menu_list = ""; $column_value = ""; for($i=1;$i<= $menu_level ;$i++){ if($menu_list != '') $menu_list .= ', '; $menu_list .= "menu".$i; if($column_value != '') $column_value .= ', '; $column_value.= "'".addslashes($tab[$i])."'"; //var_dump($column_value); } $req="INSERT IGNORE INTO menu_itm (id, ".$menu_list.",menu_niveau) VALUES(".$tab[0].",".$column_value.",'".$menu_level."')"; echo $req."</br>"; sql($req);
}
Я хотел бы, чтобы все поблагодарили вас за вашу помощь, все люди, которые внесли свой вклад, оказали большую помощь. Я многому научился. Спасибо Райан Винсент и за вашу помощь, вы дали много времени, я благодарен вам за это.)