Вопрос:

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

php

213030 просмотра

11 ответа

1351 Репутация автора

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

Автор: Frank Nwoko Источник Размещён: 08.01.2011 09:10

Ответы (11)


427 плюса

26907 Репутация автора

Решение

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

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

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

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

Автор: Oswald Размещён: 08.01.2011 09:14

15 плюса

27888 Репутация автора

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

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

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

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

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

Автор: Floern Размещён: 08.01.2011 09:14

9 плюса

25764 Репутация автора

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

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

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

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

Автор: Will Vousden Размещён: 08.01.2011 09:16

4 плюса

12955 Репутация автора

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

$basenameAndExtension = explode('.', $file_name);
$ext = end($basenameAndExtension);
Автор: jon_darkstar Размещён: 08.01.2011 09:17

42 плюса

40257 Репутация автора

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

Автор: ryeguy Размещён: 08.01.2011 09:21

50 плюса

3634 Репутация автора

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

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

echo $fileExtension;
// jpg
Автор: Sinan Eldem Размещён: 09.01.2014 09:35

0 плюса

11 Репутация автора

Официальное руководство по PHP: end ()

параметры

array

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

Автор: evenvi Размещён: 08.08.2015 07:53

-3 плюса

175 Репутация автора

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

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

$ file_extension = end ( (взорваться ('.', $ file_name)) ); // нет ошибок

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

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

Автор: Manu R S Размещён: 10.02.2016 10:28

5 плюса

97 Репутация автора

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

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

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

$file_extension = @end(explode('.', $file_name));
Автор: wizard Размещён: 01.09.2016 05:02

0 плюса

21343 Репутация автора

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

Автор: Tgr Размещён: 16.04.2019 12:52

-1 плюса

31 Репутация автора

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

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

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

echo end($value);

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

Автор: Jailendra Rajawat Размещён: 03.05.2019 09:53
Вопросы из категории :
32x32