Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [tablice] Funkcja wrzucająca do tablicy
Forum PHP.pl > Forum > PHP
Asmox
Jeżeli mamy tabelę mysql trzymającą drzewo IP, przy pobieraniu danych można automatycznie ułożyć z kolejnością kategorii, czyli np.
1.1.1
1.2.1
1.2.2
1.3.1
1.4.1
1.4.2
i tak dalej i tak dalej
Jeżeli zrobimy na takim pojedynczym IP explode, to mamy całą jakby strukturę. I tu mam problem, bo chciałbym zrobić funkcję wrzucającą to tablic o jakimś zagłębieniu. Ma ona jako argumenty mieć podane zmienną tablicy i tablicę zawierającą klucze kolejnych wymiarów, czyli:
  1. function wrzucDoTablicy($tablica, array $zaglebienia, $zmienna) {
  2. /* jakis kod funkcji */
  3. }
  4. $tablica = array();
  5. $zaglebienie = array('a', 2, 'foo', 'bar')
  6. $zmienna = 'fool';
  7. wrzucDoTablicy($tablica, $zaglebienie, $zmienna);
  8. // $tablica['a'][2]['foo']['bar'] = 'fool';

Nie wiem jak to zaimplementować / nie wiem czy jest domyślna funkcja, która mogła by mi pomóc.
Fifi209
Może zacznij tak: Jest mi to potrzebne do...

Tak będzie łatwiej, uwierz.
kowalcook
sprawdź czy nie będzie przydatna array_unshift

pozdrawiam
kowalcook
Asmox
Cytat(fifi209 @ 20.09.2010, 00:14:52 ) *
Może zacznij tak: Jest mi to potrzebne do...

Tak będzie łatwiej, uwierz.

Jest mi to potrzebne do stworzenia tablicy w php, która będzie odzwierciedleniem drzewa. Bo w SQL to tak naprawdę nie jest żadne drzewo, tylko łańcuchy znaków, które mają posłużyć do zbudowania. Wydawało mi się, że to było jasne.
Dam następny przykład, czyli jak to miałoby wyglądać
  1. $mysql = new SimpleMySQL();
  2. $tabelaSQL = $mysql->getAll(); // Po prostu pobranie całej tabeli z DB
  3. $tree = array(); // Tu będzie nasze drzewo
  4. foreach($tabelaSQL as $row) {
  5. $ipArr = explode('.', $row['ip']);
  6. wrzucDoTablicy($tree, $ipArr) // Argument $zmienna z poprzedniego pomysłu w sumie można wywalić
  7. }

No i print_r($tree) ma dać ładną wieeelowymiarową tablicę o kluczach zgodnych z id kategorii
O to właśnie mi chodzi.

@EDIT
No to może czy da się zrobić jakieś generowanie klucza tablicy na kształt
  1. $key = "x][y][z";
  2. $arr[$key] = 'foobar';
  3. echo $arr[x][y][z];

Albo powiedzcie po prostu jak zrobić tablicę z ltree..

@EDIT:
Spróbuję pokazać, jakby to mogło wyglądać, ale nie może być z powodu małej elastyczności:
  1. function arrayInsert(array &$tablica, array $klucze, $zmienna) {
  2. $numKeys = count($klucze);
  3. switch ($numKeys) {
  4. case 1: $tablica[$klucze[0]] = $zmienna; break;
  5. case 2: $tablica[$klucze[0]][$klucze[1]] = $zmienna; break;
  6. case 3: $tablica[$klucze[0]][$klucze[1]][$klucze[2]] = $zmienna; break;
  7. (...)
  8. }
  9. }

I to można by pisać w nieskończoność... Co prawda więcej niż 10 poziomów do tablicy raczej mi się nie przyda, ale zastanawiam się czy nie ma może podobnej funkcji w php

@BUMP
bim2
Nie rozumiem ciebie. Jeśli wrzucisz coś do poziomu 1 (case: 1) to automatycznie wyczyścisz dalsze poziomy przecież....

  1. $tablica = array();
  2. $tablica[0][0] = 'poziom 2';
  3. $tablica[0] = 'poziom1';
  4. print_r($tablica);

Wykonaj sobie to. winksmiley.jpg W drugą stronę jest podobnie, jak wrzucisz coś poziomy dalej to zmieniasz poziomy wcześniejsze na "array()".
Asmox
tak, ale to nieistotne, bo lista węzłów drzewa będzie ułożona od najkrótszych i w dodatku klucze będą jako id z tabeli w mysql a nie dołączane przypadkowo. Zależy mi tylko, żeby dało się drzewa ip np "1.5.3.4" itd przerobić na zagnieżdżoną tablicę w php
bim2
Zastanawiam mnie jeśli to jest tylko ip to czy zagnieżdżenie nie będzie stałe? Tj. zawsze 4 klucze?
  1. $tmp = explode('.',$ip);
  2. $tablica[$tmp[0]][$tmp[1]][$tmp[2]][$tmp[3]] = $ip;
Asmox
Ops, napisałem to trochę niezrozumiale, mój błąd już się poprawiam
Moje drzewo jest tworzone na podstawie indeksów, więc się je podaje po kropkach tworząc coś na kształt IP
Przykład:
Kod
id | node | label
--------------------
1  | null | Strony
--------------------
2  | null | Linki
--------------------
3  | 1    | Webmastering
--------------------
4  | 2    | Download
--------------------
5  | 1    | Kuchnia
--------------------
6  | 1.5  | Kuchnia Włoska
--------------------
7  | 1.3  | PHP
--------------------
8  |1.3.7 | Tablice

Node przybiera taki węzeł, z którego można wyciągnąć id rodzica, poziom zagłębienia depth itd itd... ale chodzi mi o to, żeby rozbijając ten ip node użyć nowej tablicy do stworzenia całego drzewa, jako zagnieżdżoną tablicę w PHP
  1. // Bierzemy dane z rekordu o id 8
  2. $node = '1.3.7';
  3. $id = 8;
  4. $rootNode = explode($node)
  5. arrayInsert($tree, $rootNode, $id)
bim2
Dla przykładu jak masz kuchnie. Ona kwalifikuje się do Strony a do kuchni wchodzi jeszcze włoska. Tylko, że jeśli stworzysz tak tablicę jak ty sobie ją wyobrażasz to straszi informacje o "Strona" i "Kuchnia" bo je zastąpią array("Kuchnia Włoska");

Moim zdaniem warto byłoby to zrobić że jako klucz przechowujesz "label". No i trochę dziwnie trzymasz te dane. Zróbiłbym tak że jest kolumna parent i tam id rodzica. Wtedy rekurencyjnie jesteś w stanie łatwo taką tablicę stworzyć odwołując się do całej tabeli.

Pobierasz wszystko z bazy.
  1. $baza = $db->fetchAll(...);
  2. foreach($baza as $v) {
  3. $dane[$v['id']] = $v;
  4. }

i teraz operujesz na tych danych odpowiednio poprzez rekurencję.
Asmox
Bo ja tak naprawdę chciałbym to wyświetlić na stronie tak żeby było widać zagnieżdżenia, znalazłem funkcję jak z wielowymiarowej tablicy zrobić superlistę <ul> (http://algorytmy.pl/?id=2290&pp=503) mogę wkleić kod funkcji, a z tworzeniem takiej zagnieżdżonej tablicy radziłem sobie też jakoś: (http://forum.php.pl/index.php?showtopic=156096&hl=)
Po prostu chciałbym znaleźć jakieś bardziej wydajne rozwiązanie, bo taka lista drzewa ma być tylko i wyłącznie do wyświetlenia
bim2
Więc nie przerabiaj tego na tablice. Jeśli masz to pokolei pobrane to liczysz (explode i count) jakie jest zagnieżdżenie. Jeśli jest to 1 element z takiego zagnieżdżenia to robisz <ul> i jeśli spada o zagnieżdżenie niżej to robisz </ul></ul> a menu wyświetlasz w <li> Powinno coś z tego wyjść.
Asmox
Nie rozumiem za bardzo...
  1. foreach ($treeTable as $row) {
  2. $myCount = count (explode ($row['node']));
  3. $nextCount = count (explode (next ($row)['node']));
  4. if ($myCount > $nextCount)
  5. echo "<li>{$wpis['label']} <ul>";
  6. if ($myCount == $nextCount)
  7. echo "<li>{$wpis['label']} </li>";
  8. }
  9. if ($myCount < $nextCount)
  10. echo "<li>{$wpis['label']} </li></ul>";
  11. }
  12. }

coś takiego?
bim2
Nie winksmiley.jpg
  1. $lastCount = 0;
  2. echo '<ul>';
  3. foreach ($treeTable as $row) {
  4. $myCount = count (explode ($row['node']));
  5. if ($myCount > $lastCount) {
  6. echo '<ul>';
  7. }
  8. echo "<li>{$wpis['label']} </li>";
  9.  
  10. if ($myCount < $lastCount) {
  11. echo '</ul>';
  12. }
  13. }
  14. echo '</ul>';

Spróbuj tak
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.