2012-03-24 23 views
31

Sto cercando di ottenere una directory ricorsivo basato su HTML annuncio basato sul codice qui:"severe normative: Solo le variabili devono essere passati per riferimento" errore

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

codice viene eseguito bene, ma getta alcuni errori :

standard rigorosi: solo le variabili devono essere passati per riferimento in C: \ xampp \ htdocs \ directory5.php on line 34

rigoroso standard s: Solo le variabili devono essere passati per riferimento in C: \ xampp \ htdocs \ directory5.php on line 32

rigidi standard: Solo le variabili devono essere passati per riferimento in C: \ xampp \ htdocs \ directory5.php on line 34

di seguito si riporta l'estratto di codice:

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"; 
    } 

risposta

52

Questo dovrebbe essere 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

Così la sua realtà solo semplice come mettere le cose al di fuori delle cose ... Per così dire: p –

+0

@JamieHutber Praticamente, sì. Posso confermare che la soluzione suggerita funziona su PHP 5.3.27. – crmpicco

+7

@JamieHutber Leggermente più coinvolto.Il prototipo per array_pop è array_pop misto (array e $ array) Nota la e commerciale nel parametro. Ciò significa che il parametro di input dell'array viene passato per riferimento e non per valore. L'array di input è abbreviato di un elemento, ovvero l'elemento restituito, l'ultimo elemento dell'array, che viene rimosso dall'array di input. L'unico modo per modificare il valore dell'argomento di input è passarlo per riferimento. L'espressione del codice originale non può avere il suo valore modificato perché non ha una locazione di memoria con un valore che può essere referenziato. – Jim

24

array_shift l'unico parametro è un array passato per riferimento. Il valore restituito di explode(".", $value) non ha alcun riferimento. Quindi l'errore.

È necessario memorizzare prima il valore restituito su una variabile.

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

Da PHP.net

Le seguenti cose possono essere passate per riferimento:

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

Nessun altre espressioni devono essere passati per riferimento, come il risultato è indefinito. Ad esempio, i seguenti esempi di passaggio per riferimento non sono validi:

+0

grazie shiplu ... – user1184100

3

Ho avuto un problema simile.

Penso che il problema è che quando si tenta di racchiudere due o più funzioni che trattano un tipo di matrice di variabile, php restituirà un errore.

Diciamo per esempio questo.

$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; 

Ecco qui!

+0

Hai ragione. In effetti queste cose causano errori e avvertimenti. –

2

Invece di analizzare manualmente E 'meglio usare la funzione pathinfo:

$path_parts = pathinfo($value); 
$extension = strtolower($path_parts['extension']); 
$fileName = $path_parts['filename']; 
Problemi correlati