"Строгие стандарты: только переменные должны передаваться по ссылке"

Я пытаюсь получить рекурсивный список каталогов на основе HTML на основе кода здесь:

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

Код работает нормально, но он вызывает некоторые ошибки:

Строгие стандарты: только переменные должны передаваться по ссылке в C:\xampp\htdocs\directory5.php в строке 34

Строгие стандарты: только переменные должны передаваться по ссылке в C:\xampp\htdocs\directory5.php в строке 32

Строгие стандарты: только переменные должны передаваться по ссылке в C:\xampp\htdocs\directory5.php в строке 34

Ниже приведен фрагмент кода:

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

Ответ 1

Это должно быть ОК

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

Ответ 2

array_shift единственным параметром является массив, переданный по ссылке. Возвращаемое значение explode(".", $value) не имеет ссылки. Отсюда ошибка.

Сначала вы должны сохранить возвращаемое значение переменной.

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

От PHP.net

Следующие действия могут быть переданы по ссылке:

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

Никакие другие выражения не должны передаваться по ссылке, так как результат undefined. Например, следующие примеры передачи по ссылке недействительны:

Ответ 3

У меня была аналогичная проблема.

Я думаю, проблема заключается в том, что при попытке заключить две или более функции, относящиеся к типу массива, php вернет ошибку.

Скажем, например, этот.

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

// This function returns the last key of an array (in this case it $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;

Там вы идете!

Ответ 4

Вместо того, чтобы вручную разобрать его, лучше использовать pathinfo:

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