2012-03-24 12 views
31

Próbuję uzyskać katalogu rekurencyjny HTML oparte na wykazie na podstawie kod tutaj:„Strict Standards: Tylko zmienne powinny być przekazywane przez referencję” Błąd

http://webdevel.blogspot.in/2008/06/recursive-directory-listing-php.html

Kod działa poprawnie, ale to rzuca pewne błędy :

surowe normy: Tylko zmienne powinny być przekazywane przez referencję w C: \ xampp \ htdocs \ directory5.php na linii 34

Strict Standardowy s: Tylko zmienne powinny być przekazywane przez referencję w C: \ xampp \ htdocs \ directory5.php na linii 32

surowe normy: Tylko zmienne powinny być przekazywane przez referencję w C: \ xampp \ htdocs \ directory5.php na linii 34

Poniżej znajduje się fragment kodu:

else 
    { 
    // the extension is after the last "." 
    $extension = strtolower(array_pop(explode(".", $value))); //Line 32 

    // the file name is before the last "." 
    $fileName = array_shift(explode(".", $value)); //Line 34 

    // continue to next item if not one of the desired file types 
    if(!in_array("*", $fileTypes) && !in_array($extension, $fileTypes)) continue; 

    // add the list item 
    $results[] = "<li class=\"file $extension\"><a href=\"".str_replace("\\", "/",  $directory)."/$value\">".$displayName($fileName, $extension)."</a></li>\n"; 
    } 

Odpowiedz

52

to powinno być OK

$value = explode(".", $value); 
    $extension = strtolower(array_pop($value)); //Line 32 
    // the file name is before the last "." 
    $fileName = array_shift($value); //Line 34 
+7

więc jej naprawdę tak proste, jak oddanie rzeczy poza rzeczy ... Że tak powiem: P –

+0

@JamieHutber Prawie tak. Potwierdzam rozwiązanie sugerowane prace na PHP 5.3.27. – crmpicco

+7

@JamieHutber Nieco bardziej zaangażowany.Prototyp dla array_pop to mixed array_pop (array & $ array) Zwróć uwagę na znak ampersand w parametrze. Oznacza to, że parametr wejściowy tablicy przekazywany jest przez odniesienie, a nie przez wartość. Tablica wejściowa jest skracana przez jeden element, mianowicie zwracany element, ostatni element tablicy, który jest usuwany z tablicy wejściowej. Jedynym sposobem modyfikacji wartości argumentu wejściowego jest przekazanie go przez odniesienie. Wyrażenie, w którym oryginalny kod nie może mieć zmodyfikowanej wartości, ponieważ nie ma nazwanej lokalizacji pamięci z wartością, do której można się odwoływać. – Jim

24

array_shift Jedynym parametrem jest tablica przekazana przez odniesienie. Wartość zwracana explode(".", $value) nie ma odniesienia. Stąd błąd.

Najpierw należy zapisać wartość zwracaną do zmiennej.

$arr = explode(".", $value); 
    $extension = strtolower(array_pop($arr)); 
    $fileName = array_shift($arr); 

Od PHP.net

Następujące rzeczy mogą być przekazywane przez odniesienie:

- Variables, i.e. foo($a) 
- New statements, i.e. foo(new foobar()) 
- [References returned from functions][2] 

Żadne inne wyrażenia powinny być przekazywane przez referencję, w wyniku jest niezdefiniowany. Na przykład poniższe przykłady przekazywania przez odniesienie są nieprawidłowe:

+0

dzięki shiplu ... – user1184100

3

Miałem podobny problem.

Myślę, że problem polega na tym, że gdy spróbujesz zamknąć dwie lub więcej funkcji, które dotyczą zmiennej typu tablica, php zwróci błąd.

Powiedzmy na przykład ten.

$data = array('key1' => 'Robert', 'key2' => 'Pedro', 'key3' => 'Jose'); 

// This function returns the last key of an array (in this case it's $data) 
$lastKey = array_pop(array_keys($data)); 

// Output is "key3" which is the last array. 
// But php will return “Strict Standards: Only variables should 
// be passed by reference” error. 
// So, In order to solve this one... is that you try to cut 
// down the process one by one like this. 

$data1 = array_keys($data); 
$lastkey = array_pop($data1); 

echo $lastkey; 

Idź!

+0

Masz rację. Rzeczywiście te rzeczy powodują błędy i ostrzeżenia. –

2

Zamiast analizowania go ręcznie, to lepiej użyć pathinfo funkcję:

$path_parts = pathinfo($value); 
$extension = strtolower($path_parts['extension']); 
$fileName = $path_parts['filename']; 
Powiązane problemy