Только переменные должны передаваться по ссылке

// 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 дня все еще застрял.

Ответ 1

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

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

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

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

Ответ 2

Совместимость с Php 7:

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

echo $fileExtension;
// jpg

Ответ 3

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

Ответ 4

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

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

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

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

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

Ответ 5

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

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

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

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

Ответ 6

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

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

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

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

Ответ 7

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

$basenameAndExtension = explode('.', $file_name);
$ext = end($basenameAndExtension);

Ответ 8

PHP offical Руководство: конец()

Параметры

array

Массив. Этот массив передается по ссылке, потому что он модифицируется функцией. Это означает, что вы должны передать ему реальную переменную, а не функцию, возвращающую массив, потому что только фактические переменные могут передаваться по ссылке.

Ответ 9

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

Ответ 10

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

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

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

echo end($value);

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

Ответ 11

$file_extension = end (explode ('.', $file_name));//ОШИБКА НА ЭТОЙ ЛИНИИ

измените эту строку как,

$file_extension = end ((explode ('.', $file_name)));//нет ошибок

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

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