Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ PHP _ Multitidimensional array

Napisany przez: KR2615 28.09.2022, 09:00:05

Hej
Mam w bazie MySQLu odczyty z urządzeń sieciowych. Struktura bazy wygląda tak:

  1. CREATE TABLE `sg_queues` (
  2. `id` int NOT NULL,
  3. `devid` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  4. `date` date NOT NULL,
  5. `error` int DEFAULT NULL,
  6. `value` text NOT NULL
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

Pole value zawiera od kilkuset do tysiąca linijek typu:
Kod
ID2172;192.168.106.8/32;0/0;JAN_NOWAK_(10);typ/typ;false;14859234/652905818;116182/518319
ID2201;192.168.106.9/32;0/0;DABROWSKI_LUKASZ_(10);typ/typ;false;94048477/3741833695;698959/2845428
ID2076;192.168.106.10/32;0/0;KOWALSKI_GRZEGORZ_(10);typ/typ;false;35780712/827862853;365418/647407

Pierwsza wartość rozdzielona ; to jak widać ID klienta.

Innym poleceniem pobieram sobie z innej bazy danych listę klientów i wyszukuję w tym polu value [text] odpowiedniej linijki:
  1. $sgq = "SELECT * FROM `sg_queues` WHERE date = '$data' AND devid = '$devid' ORDER BY id DESC LIMIT 1";
  2. $sgres = $mysqli -> query($sgq);
  3. $queue = mysqli_fetch_array($sgres, MYSQLI_ASSOC);
  4. $lines = http://www.php.net/explode(PHP_EOL, $queue['value']);
  5.  
  6. $cq = "SELECT * FROM `customers` WHERE status = '1';
  7. $res = $mysqli -> query($cq);
  8.  
  9. while($cust = mysqli_fetch_array($res, MYSQLI_ASSOC)) {
  10. $search_string = '/ID'.sprintf('%04d', $cust['id']).'/';
  11. $found = preg_grep($search_string, $lines)
  12. var_dump($found);
  13. }

W odpowiedzi dostaję mniej więcej coś takiego:
Cytat
array(1) { [47]=> string(103) "ID2172;192.168.106.8/32;0/0;JAN_NOWAK_(10);typ/typ;false;14859234/652905818;116182/518319" }
array(1) { [1077]=> string(103) "ID2201;192.168.106.9/32;0/0;DABROWSKI_LUKASZ_(10);typ/typ;false;94048477/3741833695;698959/2845428" }
array(1) { [384]=> string(103) "ID2076;192.168.106.10/32;0/0;KOWALSKI_GRZEGORZ_(10);typ/typ;false;35780712/827862853;365418/647407" }

Nie za bardzo tylko wiem, jak odnieść się potem w kodzie do tej wartości string(103) nie znając teo pogrubionego ID. Czy ktoś może pomóc?

Napisany przez: nospor 28.09.2022, 09:10:58

Nie bardzo rozumiem o co pytasz. Co chcesz ostatecznie miec?

Napisany przez: KR2615 28.09.2022, 14:23:51

chciałbym sobie np. funkcjoą explode() pociąć po ; tego stringa ale raz kryje mi się on pod $found[47][0], innym razem jako $found[1077][0]. Jak ten numerek namierzyć?

Napisany przez: nospor 28.09.2022, 14:26:34

Nie kumam. Przeciez masz w zmiennej $found swoje ciagi to je sobie tnij. Wszystko tam masz.

A jak bardzo sie upierasz, by pobrac te 47 to po to jest funkcja key(). Ale nadal uwazam ze to jest zbedne jej uzycie, skoro w $found masz wszystko co ci potrzeba.

Napisany przez: trueblue 28.09.2022, 14:27:39

Po prostu znaleziony wynik wrzucaj do tablicy, $cust['id'] to klucz tablicy, a linijka wartość dla tego klucza.

Napisany przez: KR2615 28.09.2022, 15:34:17

Tylko jak mam ciąć? Te 47 i 1077 to nie są ID klienta tylko numery linijki z $queues['value'];
Taki kod:

  1. http://www.php.net/var_dump($found);
  2. $values = http://www.php.net/explode(";", $found);

daje:
Kod
<b>Warning</b>:  explode() expects parameter 2 to be string, array given in <b>/var/www/noc/noc.inc.php</b> on line <b>1645</b><br />
array(1) {
  [48]=>
  string(90) "ID0014;192.168.103.8/32;0/0;BIURO;EPC/EPC;false;51875790/1190583277;305371/1008306"
}

Napisany przez: Salvation 28.09.2022, 15:39:58

Co Ty chcesz ciąć skoro 47 i 1077, z Twojego przykładu, to klucze tablicy?

  1. foreach ($found as $id => $text) {
  2. $texts = http://www.php.net/explode(';', $text);
  3.  
  4. http://www.php.net/var_dump($id);
  5. http://www.php.net/var_dump($texts);
  6. }

Napisany przez: KR2615 28.09.2022, 23:18:07

O właśnie, o klucze tablicy mi chodziło. Zadziałało, dzięki!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)