[PHP]Usuwanie stringów z tablicy

Witam serdecznie,

Array
(
    [0] = 27|2014-03-26 22:03:26
    [1] = 18|2014-03-05 10:39:36
    [2] = 15|2014-03-26 17:40:17
    [3] = 21|2014-03-05 18:04:19
    [4] = 18|2014-03-26 22:17:16
)
foreach ($arr as $key => $value) {
	if (substr($value, 0, 2) == "18") {
		unset($arr, $key);	
	}
}

Chyba unset($arr[$key]); 

:wink:

kod niestety nie działa  :frowning:

dziki, pomoglo :slight_smile:

 

Czy nie będzie problemu w momencie gdy ta tablica będzie miała 7000 rekordów??:slight_smile:

Osobiście dla bezpieczeństwa dałbym sprawdzanie pierwszych trzech znaków tj. 18| - ot jak np. będzie 181.

Problemu nie będzie o ile będziesz to odpalać przez CLI, przez WebRequest to kwestia wydajności maszyny.

Dla tablic najlepiej użyć:

$tab=preg_grep("/^18/",$tab,PREG_GREP_INVERT);

Skąd bierzesz tę tablicę?  Pewnie z pliku tekstowego. Więc niema sensu go zamieniać na tablicę. Jeśli przetwarzasz logi to lepiej żebyś użył wyrażeń regularnych. Powinny być o wiele szybsze niż przelatywanie po tablicy. Więcej o wyrażeniach reguralnych:

http://gajdaw.pl/php/wyrazenia-regularne-pcre-php-tutorial/print.html#R5

 

Przykładowo. Wczytujesz plik :

$a=file_get_contents(‘log1.txt’);

Usuwasz linijki zaczynające się na od ‘18’ po których jest 20 znaków i jest (lub go nie ma) zakończenie linii :

$a=preg_replace(’/^18.{20}\r?\n?/m’,’’,$a); 

 

Zapisujesz do pliku za pomocą file_put_contents() lub zamieniasz na tablice za pomocą .explode().

Jak nie chcesz wczytywać z pliku tylko z tablicy to tablice zamieniasz na string za pomocą  implode().

 

Ewentualnie można użyć innego wyrażenia, które powinno działać szybciej. 

$a="\r\n".file_get_contents(‘log1.txt’);  // Na początku dodajemy znak końca linii będziemy od niego wyszukiwać.

$a=preg_replace(’/\r\n18.{20}/’,’’,$a); // plik musi mieć zakończenia linii Windosowe, czyli  \r\n.

A najprościej i najwydajniej będzie:

$b = array_filter($a, function($e) {
    return strpos($e, '18|') !== 0;
});

Dziękuję bardzo za odpowiedź i pomoc.

tablice mam gotowe, z mysql… Sa poczatkowo w formacie (przykładowo): a:2:{i:1;s:22:“27|2014-03-26 23:24:35”;i:2;s:22:“18|2014-03-26 22:17:16”;}

 

zamieniam to sobie na tablicę:

$tablica = unserialize($pr);

i wtedy muszę z tego wyciąć dane okrojone o wybrane wartości (przykładowo te 18)… Problem w tym, że tych rekordów w tablicy jest dużo i nie wiem co będzie wydajne…