Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Problem z explode i implode
Forum PHP.pl > Forum > Przedszkole
Morale
skrypt:

  1. <?php
  2. $file = file('plik.info');
  3. $blok_osob = explode("\n", $file);
  4. $blok_osob2 = implode(",", $blok_osob);
  5. ?>


plik plik.info:

Cytat
1
44
22
989
2


Ten skrypt miał z tego pliku (plik.info) wyświetlić zawartość ale zamiast \n pokazywać przecinek czyli:

Cytat
1,44,22,989,2,


Ale to coś nie działa.

Po prostu jak zrobić by znak nowej linii zamienić na przecinki ? Ale explode i implode, a nie str_replace.

Bo jak potem sprawdzam:
  1. <?php
  2. if (in_array(5, $blok_osob2)) {
  3.  
  4. } else {
  5.  
  6. }
  7. ?>


to jest błąd:
Cytat
Warning: in_array() [function.in-array]: Wrong datatype for second argument i
batman
Funkcja file, czyli

  1. <?php
  2. $file = file('plik.info');
  3. $blok_osob2 = implode(",", $file);
  4. ?>


W manualu jest wszystko winksmiley.jpg
Morale
mam taki kod teraz:

  1. <?php
  2. $plik_osob = file('plik.info');
  3. $blok_osob = implode(", ", $plik_osob);
  4.  
  5.  
  6. $blokowane_osoby_id = $blok_osob; 
  7.  
  8. if (in_array($nazwa_pliku, $blokowane_osoby_id)) {
  9.  
  10. } else {
  11.  
  12. }
  13. ?>


błąd nadal:

Cytat
Warning: in_array() [function.in-array]: Wrong datatype for second argument in xxx on line 666


Linia 666 ( :-> ):

  1. <?php
  2. if (in_array($nazwa_pliku, $blokowane_osoby_id)) {
  3. ?>
batman
W linii 666 jest:
  1. <?php
  2. if (in_array($nazwa_pliku, $blokowane_osoby_id)) {
  3. ?>

czy:
  1. <?php
  2. if (in_array($nazwa_pliku, $blokowane_osoby)) {
  3. ?>


Jeśli to pierwsze, to $blokowane_osoby_id nie jest tablicą.
phpion
  1. <?php
  2. $plik_osob = file('plik.info');
  3. $blok_osob = implode(", ", $plik_osob);
  4.  
  5. // drugi parametr powinien byc tablica, a nie stringiem
  6. if (in_array($nazwa_pliku, $plik_osob)) {
  7.  
  8. } else {
  9.  
  10. }
  11. ?>

Po zmienną $nazwa_pliku powinienieś podstawić id osoby, którą chcesz sprawdzić pod kątem banowania.
Morale
@phpion - $nazwa_pliku = 1

@batman - czemu nie jest (ja tam tylko usunąłem te "_id") ?


Nie wiem nadal co jest źle...

Jak daję:
  1. <?php
  2. if (in_array($nazwa_pliku, array('25'))) {
  3. ?>


to działa ..
batman
Teraz już jest winksmiley.jpg

Wcześniej było:
  1. <?php
  2. $blokowane_osoby = $blok_osob;
  3. ?>


edit
W instrukcji warunkowej użyłeś zmiennej $blokowane_osoby_id, do której nie przypisałeś tablicy

Tak powinno działać:
  1. <?php
  2. $plik_osob = file('plik.info');
  3. $blok_osob = implode(", ", $plik_osob);
  4.  
  5. if (in_array($nazwa_pliku, $plik_osob)) {
  6.  
  7. } else {
  8.  
  9. }
  10. ?>



edit poprawiłem błąd w instrukcji warunkowej.
Morale
Chyba wiem co, teraz tak dałem:

  1. <?php
  2. if (in_array($nazwa_pliku, array($blokowane_osoby_id))) {
  3. ?>


I już nie wyświetla błędu...

Jednakże nic nie robi. Nie ważne czy mam to id, czy nie mam
phpion
Cytat(batman @ 12.01.2008, 15:12:49 ) *
Teraz już jest winksmiley.jpg

Wcześniej było:
  1. <?php
  2. $blokowane_osoby = $blok_osob;
  3. ?>


edit
W instrukcji warunkowej użyłeś zmiennej $blokowane_osoby_id, do której nie przypisałeś tablicy

Tak powinno działać:
  1. <?php
  2. $plik_osob = file('plik.info');
  3. $blok_osob = implode(", ", $plik_osob);
  4.  
  5. if (in_array($nazwa_pliku, $blok_osob)) {
  6.  
  7. } else {
  8.  
  9. }
  10. ?>

@batman: to nie ma prawa działać! $blok_osob to string! poczytaj o parametrach w in_array" title="Zobacz w manualu PHP" target="_manual

@Morale: weź odpal mój kod i zobacz czy Ci zadziała. Jeśli w pliku plik.info masz id zbanowanych ludków, a $nazwa_pliku przechowuje id usera którego chcesz sprawdzić to powinno działać.
batman
@phpion
Masz rację. Nie tą zmienną skopiowałem.

@Morale
Sorki za błąd, za chwilę go poprawię.
phpion
@batman: spoko smile.gif hehe

Ponawiam:
  1. <?php
  2. $plik_osob = file('plik.info');
  3. $blok_osob = implode(", ", $plik_osob);
  4.  
  5. // drugi parametr powinien byc tablica, a nie stringiem
  6. if (in_array($nazwa_pliku, $plik_osob)) {
  7. echo 'masz bana!';
  8. } else {
  9. echo 'wstep wolny';
  10. }
  11. ?>
Morale
Cytat(phpion @ 12.01.2008, 13:28:01 ) *
@batman: spoko smile.gif hehe

Ponawiam:
  1. <?php
  2. $plik_osob = file('plik.info');
  3. $blok_osob = implode(", ", $plik_osob);
  4.  
  5. // drugi parametr powinien byc tablica, a nie stringiem
  6. if (in_array($nazwa_pliku, $plik_osob)) {
  7. echo 'masz bana!';
  8. } else {
  9. echo 'wstep wolny';
  10. }
  11. ?>


1. Ten kod nie pomyli "1" z "11" ?

2. Błędu nie wyświetla, ale nawet jak się id znajduje to nie blokuje.

Plik:

Cytat
25
1
3
phpion
Cytat(Morale @ 12.01.2008, 15:31:12 ) *
1. Ten kod nie pomyli "1" z "11" ?

Nie.

Cytat(Morale @ 12.01.2008, 15:31:12 ) *
2. Błędu nie wyświetla, ale nawet jak się id znajduje to nie blokuje.

Testowałeś już z echo w warunku czy bez nich? Jeśli z nimi to daj rezultat:
  1. <?php
  2. echo $nazwa_pliku;
  3. print_r($plik_osob);
  4. ?>
Morale
wynik:

Cytat
25
Array ( [0] => 25 [1] => 1 [2] => 3 )
phpion
Czyli wszystko ok. Pokaż cały swój kod.
Morale
  1. <?php
  2. $plik_osob = file('plik.info');
  3.  
  4.  
  5.  
  6. if (in_array($nazwa_pliku, $plik_osob)) {
  7. //jesli rowna sie
  8.  
  9. echo 'BAN !';
  10.  
  11. } else {
  12. //jesli sie nie rowna
  13.  
  14. //inny kod
  15. }
  16. ?>


Jak daję :

  1. <?php
  2. if (in_array($nazwa_pliku, array('25'))) {
  3. ?>


To działa, ale muszę to zautomatyzować. Więc muszę wczytywać plik.
phpion
A tak?

  1. <?php
  2. //$plik_osob = file('plik.info');
  3. $plik_osob = array(1, 2, 3);
  4. $nazwa_pliku = 2;
  5.  
  6.  
  7.  
  8. if (in_array($nazwa_pliku, $plik_osob)) {
  9. //jesli rowna sie
  10.  
  11. echo 'BAN !';
  12.  
  13. } else {
  14. //jesli sie nie rowna
  15.  
  16. //inny kod
  17. }
  18. ?>
Morale
ma ktoś jakiś pomysł na wczytanie numerków z pliku żeby to działało ?


próbowałem też tak, ale ciągle pokazuje "nie działa" (choć $nazwa_pliku jest w $linia, bo sprawdzałem):

  1. <?php
  2. $linia = Array();
  3.  
  4. $fp = fopen("plik.info", "r"); 
  5. flock($fp, LOCK_EX); 
  6. while (!feof ($fp)) { 
  7. $linia[] = fgets($fp); 
  8. }
  9.  
  10.  
  11.  
  12. if (in_array($nazwa_pliku, $linia)) {
  13.  
  14. echo "ban !";
  15. } else {
  16.  
  17. echo "nie działa";
  18. }
  19. ?>
batman
Pofatygowałem się i uruchomiłem ten skrypt. Co się okazało - działa.
Zrób tak i nasz co się wyświetliło:
  1. <?php
  2. $plik_osob = file('plik.info');
  3.  
  4. echo '<pre>';
  5. echo 'nazwa_pliku: ';
  6. var_dump($nazwa_pliku);
  7. echo '<br />';
  8. echo 'plik_osob: ';
  9. var_dump($plik_osob);
  10. echo '</pre>';
  11.  
  12. if (in_array($nazwa_pliku, $plik_osob)) {
  13. echo 'BAN !';
  14. } else {
  15. echo 'NIE BAN!';
  16. }
  17. ?>
Morale
Cytat
nazwa_pliku: string(2) "25"

plik_osob: array(4) {
[0]=>
string(3) "1
"
[1]=>
string(4) "33
"
[2]=>
string(4) "25
"
[3]=>
string(3) "4
"
}
batman
Z tego wynika, że nie wczytało Ci pliku. I dlatego nie działa. Sprawdź czy masz ścieżkę do pliku poprawnie podaną oraz czy nie pojawiły się jakieś błędy PHP.

edit
Sorki za ten post. Coś źle zobaczyłem smile.gif

edit2

Dodaj takie coś przez instrukcją warunkową:
  1. <?php
  2. $nazwa_pliku = (int)$nazwa_pliku;
  3. ?>
Morale
czyli co, bo nie rozumiem :-> przecież jest w: plik_osob[2] = 25
nospor
Czytam ten temat i czytam i wyjsc z podziwu nie moge jak tylko doswiadczonych osob z tego forum meczy sie z taką pierdułą.... tongue.gif

podpowiem wam troche gdzie macie blad:
http://pl2.php.net/manual/pl/function.file.php
Cytat
Elementy tablicy zawierają znak nowej linii.

No i juz radzcie sobie dalej sami smile.gif

ps: ostatnia propozycja batmana z rzutowaniem na inta oczywiscie rozwiązuje problem, choc nie jestem pewien czy zrobil to swiadomie winksmiley.jpg
Morale
Dzięki za pomoc smile.gif


Czyli co było źle i o co chodzi z tym int?
batman
@nospor
Masz rację. Też to znalazłem w manualu, ale po co komplikować sprawę, skoro wystarczy zrzutować na int-a smile.gif Cały czas myślałem, że w zmiennej $nazwa_pliku znajduje się wartośc liczbowa, a nie string.
nospor
Cytat
Czyli co było źle i o co chodzi z tym int

Bylo to źle, ze kazdy element w tablicy mial znak nowej linii. No i ty przyrownywales test '25' do tekstu '25nowalinia' co oczywiscie nie jest sobie rowne. Jesli natomiast bys przyrownywal liczbe 25 z tekstem '25nowalinia' to tekst jest konwertowany automaycznie na liczbe i wtym przypadku na 25, a 25=25 wiec git smile.gif
batman
Lepiej bym tego nie ujął smile.gif
Taki banalny temat, a dwie strony zajął. Może warto zastanowić się nad nowym FAQ lub kursem PHP, który będzie zawierał wszystkie nietypowe błędy i problemy poruszane na forum oraz sposoby ich odnajdywania?
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.