Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak uzyskać klucz danego elementu tablicy ?
Forum PHP.pl > Forum > PHP
Cudi
Mam tablice stworzoną przez funkcje file(), jak wiadomo trzyma ona tablice której elementy odpowiadają kolejnym linią w pliku. Chciałbym na początku każdego z elementów dopisać nr. linie w której sie znajduje, tylko niebardzo wiem jak się do tego zabrać (jak uzyskać klucz?) Jest jakieś rozwiązanie oprócz użycia pętli ?
DeyV
Cytat
key() zwraza klucz bieżącego elementu z tablicy asocjacyjnej.
Cudi
Tak, ale to nie będzie tablica asocjacyjna :] Pozatym dam chyba kod bo cięzko jest mnie zrozumieć. Konstruktor mojej klasy:

[php:1:09e56b662e]<?php
function txt_file($file_name){
if(!file_exists($file_name))
CreateEmptyFile($file_name);

$this->file_name = $file_name;
$this->lines = explode("n", str_replace("r", '', join('', file($file_name))));
$this->cnt = count($this->lines);
unset($this->lines[--$this->cnt]);
}
?>[/php:1:09e56b662e]

I teraz chodzi o to, żeby do każdej linijki (każdego elementu zmiennej klasowej lines) dodąc na początek jego klucz (będzie to poprostu kolejny numer indexu). Czyli jeśli zawartość pierwszej lini w pliku jest taka:
Kod
Cudi|+|cudi@wp.pl

To trzeba by ją zamianić na taką:
Kod
0|+|Cudi|+|cudi@wp.pl

I teraz nie wiem czy da sie to osiągnąć bez użycia pętli, bo w między czasie pomyślałem troche i doszedłem do tego że łatwo to można osiągnąć foreachem ($this->lines as $key => $line) :]

Może jeszcze wyjaśnie po co to wszystko :] Ano klasa ma możliwość wybrania dowolych linijek od do i posortowania ich (używam array_multisort()). A klucz danej linijki normlanie jest jej id, do którego moge sie odnieść usuwająć ją lub edytując. A po sortowaniu klucze sie pomieszają, i potem już nikt nie będzie wiedział co sie zapisze, co updateuje itd :] I teraz próbująć dojść do tego jak temu zapobiec wpadłem na pomysł aby poprostu dodać te klucze na początek linijek i mieć je zgłowy :]
KaMeLeOn
Bez pętli nie dasz rady...

BTW. Na twoim miejscu tworzyłbym
takie id przy zapisie linijki do pliku.
Tzn. pobierasz ostatnią linię sprawdzasz id,
teraz $id++ i po klopocie...
Cudi
No właśnie zastanawiam sie cały czas nad tym, bo chce żeby klasa była jak najbardziej funkcjonalna :] I chyba dochodze do wniosku że masz racje. I dzięki że chciało Ci sie to czytać :]
KaMeLeOn
Jeśli zrobiłbyś tak jak chcesz to byłoby to dosyć wolne...
Konstruktor pobierałby za każdym razem plik, liczył wiersze i
uzupełniał. Lepiej mieć już gotowe...
Cudi
Masz całkowitą racje, ale czasami gdy człowiek zacznie myśleć jak odchodzić plik o kilka bajtów dochodzi aż tak daleko jak ja, i dobrze że ktoś mnie zatrzymał :]

A teraz pytanie:
To wszystko dzieje sie w klasie, i oczywiście jest też metoda do zapisu tablicy danych. I w tej metodzie trzeba by dopisać żeby w pierwszy element tablicy danych wstawiała kolejną liczbe. Samo uzyskanie liczby nie jest niczym trudnym, ale nie zabardzo wiem jak wsadzić ją na początek tej tablicy, tak żeby reszta elementów sie przesuneła o klucz do przodu :]
5z474n
hm......
[php:1:280a510401]// $tab - tablica z tymi liniami

for($i=0; $i<count($tab); $i++) {
$tab[$i] = $id . $tab[$i];
}[/php:1:280a510401]
moze tak ?
Jabol
Cytat
array_unshift() wstawia jeden lub więcej przekazanych jako parametry elementów na początek tablicy tablica. Zauważ, że lista elementów wstawiana jako całość, więc elementy zostają w takim samym porządku. Wszystkie klucze liczbowe zostaną zmodyfikowane tak, aby ich wartości zaczynały się od zera, podczas gdy klucze znakowe nie zostaną zmienione.
Cudi
Nie, bo to nie jest taka tablica jak myślisz :] Ta tablica nie trzyma całego pliku z liniami jako elementów, tylko jedną linię :] A potem leci $dane = join('|+|', $dane); i już mam jako linie którą moge wsadzić do pliku. I w sumie w tym momencie wymyśliłem rozwiązanie problemu, skoro mam już całą linię jako jeden string to wystarczy dać $dane = $id .'|+|'. $dane; i po kłopocie biggrin.gif

Update:
Jabol napisał posta prawie w tym samym momencie co ja więc nie brałem go pod uwage pisząc tą odpowiedź :]
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.