Только переменные должны быть переданы по ссылке - PullRequest
208 голосов
/ 09 января 2011
// Other variables
$MAX_FILENAME_LENGTH = 260;
$file_name = $_FILES[$upload_name]['name'];
//echo "testing-".$file_name."<br>";
//$file_name = strtolower($file_name);
$file_extension = end(explode('.', $file_name)); //ERROR ON THIS LINE
$uploadErrors = array(
    0=>'There is no error, the file uploaded with success',
    1=>'The uploaded file exceeds the upload max filesize allowed.',
    2=>'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form',
    3=>'The uploaded file was only partially uploaded',
    4=>'No file was uploaded',
    6=>'Missing a temporary folder'
);

Есть идеи?Через 2 дня все еще застрял.

Ответы [ 11 ]

427 голосов
/ 09 января 2011

Присвойте результат explode переменной и передайте эту переменную end:

$tmp = explode('.', $file_name);
$file_extension = end($tmp);

Проблема в том, что для end требуется ссылка, поскольку она изменяет внутреннее представление массива (т. Е. указатель текущего элемента указывает на последний элемент).

Результат explode('.', $file_name) не может быть преобразован в ссылку. Это ограничение в языке PHP, которое, вероятно, существует по причинам простоты.

50 голосов
/ 09 января 2014

Php 7 совместимое правильное использование:

$fileName      = 'long.file.name.jpg';
$tmp           = explode('.', $fileName);
$fileExtension = end($tmp);

echo $fileExtension;
// jpg
42 голосов
/ 09 января 2011

Все остальные уже сообщили вам причину, по которой вы получаете ошибку, но вот лучший способ сделать то, что вы хотите сделать: $file_extension = pathinfo($file_name, PATHINFO_EXTENSION);

15 голосов
/ 09 января 2011

сохранить массив из explode () в переменную, а затем вызвать end () для этой переменной:

$tmp = explode('.', $file_name);
$file_extension = end($tmp);

Кстати: я использую этот код, чтобы получить расширение файла:

$ext = substr( strrchr($file_name, '.'), 1);

где strrchr извлекает строку после последнего ., а substr обрезает .

9 голосов
/ 09 января 2011

Попробуйте это:

$parts = explode('.', $file_name);
$file_extension = end($parts);

Причина заключается в том, что аргумент для end передается по ссылке, поскольку end изменяет массив путем перемещения его внутреннего указателя на последний элемент.Если вы не передаете переменную, нет ничего для ссылки, на которую можно указать.

См. end в руководстве по PHP для получения дополнительной информации.

5 голосов
/ 01 сентября 2016

PHP жалуется, потому что end() ожидает ссылку на что-то, что он хочет изменить (что может быть только переменной). Однако вы передаете результат explode() непосредственно в end(), не сохраняя его сначала в переменной. В тот момент, когда explode() возвращает ваше значение, оно существует только в памяти и ни одна переменная не указывает на него. Вы не можете создать ссылку на что-то (или что-то неизвестное в памяти), которое не существует.

Или другими словами: PHP не знает, является ли значение, которое вы ему даете, прямым значением или просто указателем на значение (указатель также является переменной (целым числом), в которой хранится смещение памяти, где фактическая стоимость проживает). Так что PHP ожидает здесь указатель (ссылку) всегда.

Но так как это все еще просто уведомление (даже не рекомендуется) в PHP 7, вы можете безопасно игнорировать уведомления и использовать оператор игнорирования вместо полной деактивации отчетов об ошибках для уведомлений:

$file_extension = @end(explode('.', $file_name));
4 голосов
/ 09 января 2011

Так же, как вы не можете сразу индексировать массив, вы также не можете вызвать end для него. Сначала назначьте его переменной, затем вызовите end.

$basenameAndExtension = explode('.', $file_name);
$ext = end($basenameAndExtension);
0 голосов
/ 03 мая 2019

Во-первых, вам нужно будет сохранить значение в такой переменной, как эта

$value = explode("/", $string);

Затем вы можете использовать функцию end для получения последнего индекса из массива, подобного этому

echo end($value);

Я надеюсь, что это сработает для вас.

0 голосов
/ 16 апреля 2019

end(...[explode('.', $file_name)]) работает с PHP 5.6. Это задокументировано в RFC , но не в самих документах PHP.

0 голосов
/ 10 февраля 2016

$ file_extension = end (explode ('.', $ File_name));// ОШИБКА НА ЭТОЙ СТРОКЕ

изменить эту строку следующим образом:

$ file_extension = end ( (explode ('.', $ File_name)) );// без ошибок

Техника проста, пожалуйста, поставьте еще несколько скобок для разнесения,

(explode ()) , тогда только он может работать независимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...