Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [tablice] Funkcja wrzucająca do tablicy
Asmox
post
Post #1





Grupa: Zarejestrowani
Postów: 359
Pomógł: 12
Dołączył: 16.01.2009

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
Fifi209
post
Post #2





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Może zacznij tak: Jest mi to potrzebne do...

Tak będzie łatwiej, uwierz.


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
kowalcook
post
Post #3





Grupa: Zarejestrowani
Postów: 61
Pomógł: 0
Dołączył: 17.11.2005

Ostrzeżenie: (0%)
-----


sprawdź czy nie będzie przydatna array_unshift

pozdrawiam
kowalcook

Ten post edytował kowalcook 20.09.2010, 15:15:33
Go to the top of the page
+Quote Post
Asmox
post
Post #4





Grupa: Zarejestrowani
Postów: 359
Pomógł: 12
Dołączył: 16.01.2009

Ostrzeżenie: (0%)
-----


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

Ten post edytował Asmox 29.12.2010, 22:19:29


--------------------
Go to the top of the page
+Quote Post
bim2
post
Post #5





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


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()".


--------------------
Go to the top of the page
+Quote Post
Asmox
post
Post #6





Grupa: Zarejestrowani
Postów: 359
Pomógł: 12
Dołączył: 16.01.2009

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
bim2
post
Post #7





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


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;


--------------------
Go to the top of the page
+Quote Post
Asmox
post
Post #8





Grupa: Zarejestrowani
Postów: 359
Pomógł: 12
Dołączył: 16.01.2009

Ostrzeżenie: (0%)
-----


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)


Ten post edytował Asmox 30.12.2010, 19:39:11


--------------------
Go to the top of the page
+Quote Post
bim2
post
Post #9





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


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ę.


--------------------
Go to the top of the page
+Quote Post
Asmox
post
Post #10





Grupa: Zarejestrowani
Postów: 359
Pomógł: 12
Dołączył: 16.01.2009

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
bim2
post
Post #11





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


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ść.


--------------------
Go to the top of the page
+Quote Post
Asmox
post
Post #12





Grupa: Zarejestrowani
Postów: 359
Pomógł: 12
Dołączył: 16.01.2009

Ostrzeżenie: (0%)
-----


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?


--------------------
Go to the top of the page
+Quote Post
bim2
post
Post #13





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


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

Ten post edytował bim2 31.12.2010, 16:18:24


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 10:15