Php выбрать последние 5 значений из массива. PHP-массив: удалить элемент первый, последний, по значению. Примеры создания и использования массива

  • 03.11.2019

Reg.ru: домены и хостинг

Крупнейший регистратор и хостинг-провайдер в России.

Более 2 миллионов доменных имен на обслуживании.

Продвижение, почта для домена, решения для бизнеса.

Более 700 тыс. клиентов по всему миру уже сделали свой выбор.

Фреймворк Bootstrap: быстрая адаптивная вёрстка

Пошаговый видеокурс по основам адаптивной верстки в фреймворке Bootstrap.

Научитесь верстать просто, быстро и качественно, используя мощный и практичный инструмент.

Верстайте на заказ и получайте деньги.

*Наведите курсор мыши для приостановки прокрутки.

Назад Вперед

PHP: Удаление элементов массива

Перед нами стоит тривиальная с виду задача: удалить элемент массива. Или несколько элементов.

Однако, при всей ее простоте, в ней есть варианты, которые не совсем очевидны, и о которых стоит знать, если вы хотите продвинуться в PHP чуть дальше, чем "Hello, world!":)

Начнем с самой базы: чтобы удалить один элемент, нужно воспользоваться функцией unset() :

Unset($array); unset($array["foo"]);

Unset($array, $array); unset($array["foo"], $array["bar"]);

Следующий логичный вопрос: как удалить несколько элементов, которые следуют друг за другом (т.е. смежных)? Чтобы удалить несколько смежных элементов, воспользуйтесь функцией array_splice() :

Array_splice($array, $offset, $length);

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

$array = $array["foo"] = "";

Важно понимать, что функция unset() удаляет элемент, в то время как присвоение элементу "" не удаляет его, но означает что его значение становится равным пустой строке.

Если вы работаете с числами, вероятно, лучше будет связать с таким ключом значение 0.

Скажем, если компания прекратила производство деталей модели HBL-568, то в массив деталей можно внести изменение:

Unset($products["HBL-568"]);

Если же детали HBL-568 нет на складе лишь временно и ожидается ее поступление с завода, то лучше поступать иначе:

$products["HBL-568"] = 0;

Следующий момент, который нужно понимать, заключается в том, что при вызове функции unset() для элемента массива, PHP корректирует массив так, чтобы цикл по-прежнему работал правильно.

Иными словами, массив не сжимается для заполнения образовавшихся «дыр». По сути, это означает, что все массивы являются ассоциативными, даже если на первый взгляд кажутся числовыми. Давайте посмотрим на понятные примеры для иллюстрации этого поведения:

// Создание "числового" массива $animals = array("ant", "bee", "cat", "dog", "elk", "fox"); print $animals; // Выводит "bee" print $animals; // Выводит "cat" count($animals); // Возвращает 6 // unset() unset($animals); // Удаляет элемент $animals = "bee" print $animals; // Ничего не выводит и выдает ошибку E_NOTICE print $animals; // Выводит "cat" count($animals); // Возвращает 5 при том, что элемент $array остается на месте и содержит "fox" // Добавление нового элемента $animals = "gnu"; // Добавляет новый элемент print $animals; // Ничего не выводит, также выдает ошибку E_NOTICE print $animals; // Выводит "gnu" count($animals); // Возвращает 6 // Присваивание "" (пустой строки) $animals = ""; // Устанавливается значение "пустая строка" print $animals; // Выводит "" count($animals); // Возвращает 6, т.е. учитывает пустой элемент массива при подсчете

Чтобы перейти к плотно заполненному числовому массиву, воспользуйтесь функцией array_values() :

$animals = array_values($animals);

Также функция array_splice() автоматически переиндексирует массивы для устранения «дыр»:

// Создание "числового" массива $animals = array("ant", "bee", "cat", "dog", "elk", "fox"); array_splice($animals, 2, 2); print_r($animals);

На выходе получим:

Array ( => ant => bee => elk => fox)

Где может пригодиться такая возможность?

Допустим, вы работаете с массивом как с очередью и хотите из этой очереди удалить элементы, не теряя при этом возможности произвольного доступа, когда вы могли бы случайно попасть в одну из образовавшихся "дыр".

Ну и, наконец, для безопасного удаления первого или последнего элемента из массива используются функции array_shift() и array_pop() соответственно.

С ними все очень просто:

$stack = array("orange", "banana", "apple", "raspberry"); $fruit = array_shift($stack); print_r($stack);

В результате выполнения кода выше мы получим такой вывод:

Array ( => banana => apple => raspberry)

Для удаления последнего элемента воспользуемся функцией array_pop() :

$stack = array("orange", "banana", "apple", "raspberry"); $fruit = array_pop($stack); print_r($stack);

На выходе получим следующую распечатку массива:

Array ( => orange => banana => apple)

На этом всё. Основные моменты по удалению элементов массива в PHP мы разобрали. Если что - официальная документация всегда в помощь.

Понравился материал и хотите отблагодарить?
Просто поделитесь с друзьями и коллегами!


Смотрите также:

ключу вывод (24)

Я пишу создателя SQL-запросов, используя некоторые параметры. В Java очень легко обнаружить последний элемент массива из цикла for, просто проверив текущую позицию массива с длиной массива.

For(int i=0; i< arr.length;i++){ boolean isLastElem = i== (arr.length -1) ? true: false; }

В PHP у них есть нецелые индексы для доступа к массивам. Таким образом, вы должны выполнять итерацию по массиву с использованием цикла foreach. Это становится проблематичным, когда вам нужно принять какое-то решение (в моем случае добавить или / и параметр при построении запроса).

Я уверен, что должен быть какой-то стандартный способ сделать это.

Как вы решаете это на PHP?

Answers

Вы также можете сделать что-то вроде этого:

End($elements); $endKey = key($elements); foreach ($elements as $key => $value) { if ($key == $endKey) // -- this is the last item { // do something } // more code }

Вы также можете попробовать это сделать свой запрос... показанный здесь с помощью INSERT

"monday","two"=>"tuesday","three"=>"wednesday","four"=>"thursday","five"=>"friday","six"=>"saturday","seven"=>"sunday"); $keys = array_keys($week); $string = "INSERT INTO my_table (""; $string .= implode("","", $keys); $string .= "") VALUES (""; $string .= implode("","", $week); $string .= "");"; echo $string; ?>

У меня сильное чувство, что в корне этой «проблемы XY» OP хотел просто функцию implode() .

Поскольку ваше намерение найти массив EOF - это просто клей. Познакомиться с нижеприведенной тактикой. Вам не требуется EOF:

$given_array = array("column1"=>"value1", "column2"=>"value2", "column3"=>"value3"); $glue = ""; foreach($given_array as $column_name=>$value){ $where .= " $glue $column_name = $value"; //appending the glue $glue = "AND"; } echo $where;

Column1 = value1 AND column2 = value2 AND column3 = value3

Вот еще один способ сделать это:

$arr = range(1, 10); $end = end($arr); reset($arr); while(list($k, $v) = each($arr)) { if($n == $end) { echo "last!"; } else { echo sprintf("%s ", $v); } }

Для сценариев генерации SQL-запросов или всего, что делает другое действие для первого или последнего элемента, оно намного быстрее (почти в два раза быстрее), чтобы избежать использования проверок ненужных переменных.

Текущее принятое решение использует цикл и проверку внутри цикла, которые будут сделаны every_single_iteration, правильный (быстрый) способ сделать это следующий:

$numItems = count($arr); $i=0; $firstitem=$arr; $i++; while($i<$numItems-1){ $some_item=$arr[$i]; $i++; } $last_item=$arr[$i]; $i++;

Небольшой домашний тест показал следующее:

test1: 100000 прогонов модели морга

время: 1869.3430423737 миллисекунды

test2: 100000 пробегов модели, если последняя

время: 3235.6359958649 миллисекунд

Мне нравится следующее, поскольку я чувствую, что это довольно аккуратно. Предположим, мы создаем строку с разделителями между всеми элементами: например, a, b, c

$first = true; foreach ($items as $item) { $str = ($first)?$first=false:", ".$item; }

$page_comment): ?>

Когда toEnd достигает 0, это означает, что он находится на последней итерации цикла.

$toEnd = count($arr); foreach($arr as $key=>$value) { if (0 === --$toEnd) { echo "last index! $value"; } }

Последнее значение по-прежнему доступно после цикла, поэтому, если вы просто хотите использовать его для большего количества материалов после цикла, это лучше:

Foreach($arr as $key=>$value) { //something } echo "last index! $key => $value";

Если вы не хотите рассматривать последнее значение как специальные внутренние циклы. Это должно быть быстрее, если у вас большие массивы. (Если вы повторно используете массив после цикла внутри той же области действия, вам нужно сначала «скопировать» массив).

//If you use this in a large global code without namespaces or functions then you can copy the array like this: //$array = $originalArrayName; //uncomment to copy an array you may use after this loop //end($array); $lastKey = key($array); //uncomment if you use the keys $lastValue = array_pop($array); //do something special with the last value here before you process all the others? echo "Last is $lastValue", "\n"; foreach ($array as $key => $value) { //do something with all values before the last value echo "All except last value: $value", "\n"; } //do something special with the last value here after you process all the others? echo "Last is $lastValue", "\n";

И ответить на ваш оригинальный вопрос «в моем случае добавить или / и параметр при построении запроса»; это будет охватывать все значения, а затем объединить их в строку с «и» между ними, но не до первого значения или после последнего значения:

$params = ; foreach ($array as $value) { $params = doSomething($value); } $parameters = implode(" and ", $params);

Вы все равно можете использовать этот метод с ассоциативными массивами:

$keys = array_keys($array); for ($i = 0, $l = count($array); $i < $l; ++$i) { $key = $array[$i]; $value = $array[$key]; $isLastItem = ($i == ($l - 1)); // do stuff } // or this way... $i = 0; $l = count($array); foreach ($array as $key => $value) { $isLastItem = ($i == ($l - 1)); // do stuff ++$i; }

Другой способ - запомнить предыдущий результат цикла цикла и использовать его в качестве конечного результата:

$result = $where = ""; foreach ($conditions as $col => $val) { $result = $where .= $this->getAdapter()->quoteInto($col." = ?", $val); $where .= " AND "; } return $this->delete($result);

Я лично использую такую ​​конструкцию, которая позволяет легко использовать элементы html

    и
  • : просто измените равенство для другого свойства...

    Массив не может содержать ложные элементы, но все остальные элементы, которые передаются в ложное логическое значение.

    $table = array("a" , "b", "c"); $it = reset($table); while($it !== false) { echo "all loops";echo $it; $nextIt = next($table); if ($nextIt === false || $nextIt === $it) { echo "last loop or two identical items"; } $it = $nextIt; }

    Вы можете dirctly получить последний индекс:

    $numItems = count($arr);

    echo $arr[$numItems-1];

    Предполагая, что у вас есть массив, хранящийся в переменной...

    Foreach($array as $key=>$value) { echo $value; if($key != count($array)-1) { echo ", "; } }

    Похоже, вы хотите что-то вроде этого:

    $array = array("First", "Second", "Third", "Last"); foreach($array as $key => $value) { if(end($array) === $value) { echo "last index!" . $value; } }

    Если вам нужно что-то сделать для каждого элемента, кроме первого или последнего, и только если в массиве имеется более одного элемента, я предпочитаю следующее решение.

    Я знаю, что существует много решений выше и размещено месяцев / за год до моего, но это то, что я чувствую, довольно элегантно. Проверка каждого цикла также является логической проверкой, в отличие от числовой проверки «i = (счет-1)», что может позволить уменьшить накладные расходы.

    Структура цикла может показаться неудобной, но вы можете сравнить ее с упорядочением тегов (начало), tfoot (end), tbody (current) в тегах HTML-таблицы.

    $first = true; foreach($array as $key => $value) { if ($first) { $first = false; // Do what you want to do before the first element echo "List of key, value pairs:\n"; } else { // Do what you want to do at the end of every element // except the last, assuming the list has more than one element echo "\n"; } // Do what you want to do for the current element echo $key . " => " . $value; }

    Например, в терминах веб-разработки, если вы хотите добавить border-bottom для каждого элемента, кроме последнего в неупорядоченном списке (ul), тогда вы можете вместо этого добавить границу-верхнюю часть для каждого элемента, кроме первого (CSS: first-child, поддерживаемый IE7 + и Firefox / Webkit, поддерживает эту логику, тогда как: последний-ребенок не поддерживается IE7).

    Вы можете свободно повторно использовать переменную $ first для каждого вложенного цикла, и все будет работать нормально, поскольку каждый цикл делает $ first false во время первого процесса первой итерации (так что breaks / exceptions не вызовут проблем) ,

    $first = true; foreach($array as $key => $subArray) { if ($first) { $string = "List of key => value array pairs:\n"; $first = false; } else { echo "\n"; } $string .= $key . "=>("; $first = true; foreach($subArray as $key => $value) { if ($first) { $first = false; } else { $string .= ", "; } $string .= $key . "=>" . $value; } $string .= ")"; } echo $string;

    Пример вывода:

    List of key => value array pairs: key1=>(v1_key1=>v1_val1, v1_key2=>v1_val2) key2=>(v2_key1=>v2_val1, v2_key2=>v2_val2, v2_key3=>v2_val3) key3=>(v3_key1=>v3_val1)

    Одним из способов может быть обнаружение next итератора. Если на итераторе нет следующего, это означает, что вы находитесь в последнем цикле.

    Foreach ($some_array as $element) { if(!next($some_array)) { // This is the last $element } }

    Итак, если ваш массив имеет уникальные значения массива, то определение последней итерации тривиально:

    Foreach($array as $element) { if ($element === end($array)) echo "LAST ELEMENT!"; }

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

    Foreach($array as $key => $element) { end($array); if ($key === key($array)) echo "LAST ELEMENT!"; }

    Также обратите внимание на строгий оператор соприкосновения, что в этом случае весьма важно.

    Вот мое решение: просто получите счетчик вашего массива, минус 1 (начиная с 0).

    $lastkey = count($array) - 1; foreach($array as $k=>$a){ if($k==$lastkey){ /*do something*/ } }

    Похоже, вы хотите что-то вроде этого:

    $numItems = count($arr); $i = 0; foreach($arr as $key=>$value) { if(++$i === $numItems) { echo "last index!"; } }

    При этом вы не хотите - перебирать «массив», используя foreach в php.

    Есть уже много ответов, но стоит также заглянуть в итераторы, тем более, что его попросили стандартный способ:

    $arr = range(1, 3); $it = new CachingIterator(new ArrayIterator($arr)); foreach($it as $key => $value) { if (!$it->hasNext()) echo "Last:"; echo $value, "\n"; }

    Вы можете найти что-то, что делает более гибким и для других случаев.

    Неустранимая ошибка: вызов функции-члена... на не объект

    Бывает с кодом, похожим на xyz->method() где xyz не является объектом, и поэтому этот method не может быть вызван.

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

    Чаще всего это признак того, что в коде отсутствуют проверки на наличие ошибок. Подтвердите, что объект фактически является объектом перед вызовом его методов.

    typical примером может служить

    // ... some code using PDO $statement = $pdo->prepare("invalid query", ...); $statement->execute(...);

    В приведенном выше примере запрос не может быть подготовлен, и prepare() присваивает false $statement . Попытка вызова метода execute() приведет к Fatal Error, потому что false является «не-объектом», потому что значение является логическим.

    Выясните, почему ваша функция вернула логическое значение вместо объекта. Например, проверьте объект $pdo для последней произошедшей ошибки. Подробности о том, как отлаживать это, будут зависеть от того, как обрабатываются ошибки для конкретной функции / объекта / класса.

    Если даже ->prepare терпит неудачу, ваш $pdo дескриптора базы данных $pdo не попадает в текущую область . Найдите, где он определился. Затем передайте его как параметр, сохраните его как свойство или поделите его через глобальную область.

    Другой проблемой может быть условное создание объекта, а затем попытка вызова метода вне этого условного блока. Например

    If ($someCondition) { $myObj = new MyObj(); } // ... $myObj->someMethod();

    Пытаясь выполнить метод вне условного блока, ваш объект не может быть определен.

    Связанные вопросы:

    • Вызов функции-члена на не-объекте
    • Список всех PHP «Неустранимая ошибка: вызов функции-члена... на не-объект» Вопросы по

    PHP - это перспективно и современно: качественный синтаксис и возможность делать семантику за пределами дозволенного. Реализация идей объектно-ориентированного программирования и свобода изменения типа переменной делает реальностью самые смелые фантазии.

    Массивы - древняя конструкция, а ассоциативные - скорее дань времени, нежели требование практики. Хотя есть достаточное количество задач, которые предполагают создание совокупностей данных заранее не предусмотренного содержания (количество, значения, типы и индексы), которые доступны для просмотра и использования в циклах Последний элемент массива доступен при любом способе создания. Array - обычные и ассоциативные - позволяют создавать списки, но в обычном синтаксисе PHP это имеет ограниченное применение.

    Актуальное значение массива

    Если абстрагироваться от индексов и использовать конструкцию

    $arData = new scField(); // scNumber, scString, scParagraph, ...

    где scField() - конструктор абстрактного объекта - "элемента информации", который имеет наследников: числа (scNumber), строки (scString), фразы (scParagraph), ... получим на PHP: последний элемент = массив объектов, проявляющий свои свойства как актуальный элемент.

    По существу, неважно, какой элемент считать актуальным, но в этом случае придется следить за указателем (в PHP - курсор) внутри массива. Чаще - нужно иметь собственный указатель элемента. Необходимости в курсоре лишена идея PHP "последний элемент = массив". Доступный через функции end() и array_pop(), последний элемент как бы делегирует свои свойства массиву. Использование array_pop(), помимо этого, автоматически переводит массив на предыдущий элемент, и его свойства изменяются соответственно. Этим обуславливается возможность движения по элементам.

    Таким образом, рассматривая в контексте синтаксис PHP, извлечь последний элемент массива фактически означает использовать его свойства. Последовательно, помещая и извлекая элементы, получаем динамику свойств, динамику новой сформированной в пределах доступного синтаксиса.

    Первый и другие элементы

    Имеются функции для работы с первым элементом массива и перемещения внутреннего указателя. В обычном синтаксисе, реализующем классическую практику программирования, они применимы. В отношении создания массивов с динамично изменяющимся смыслом - нет.

    В программировании речь всегда идет о принятии решений: переменные принимают значения, операторы условий изменяют ход алгоритма, циклы что-то анализируют, в конечном итоге образуется результат.

    Если перенести центр тяжести на собственно элемент и предоставить ему самому принимать решения, реализация программы приобретает совершенно другой, осмысленный вид. Чаще всего именно такой способ позволяет достичь цели, особенно когда речь идет, например, об использовании многочисленных тегов документа *.docx, записанных в стандарте Open XML.

    На PHP получить последний элемент массива - это новый смысл и хорошие возможности.

    Загрузка файлов и динамика свойств массивов

    Когда сайт предоставляет возможность загрузки каких-либо файлов, удобно использовать идею абстрактного объекта, например, scFile и потомков от него scImage, scDocument, scTabe, которые будут иметь одноименные свойства, но различное их проявление и смысл (содержание). В контексте синтаксиса PHP (последний элемент = массив), используя функцию end(), можно использовать его так, как это определяет последний элемент. Это решение интересно тем, что оно инвертирует обычные представления и позволяет перемещаться по структуре данных так, как она была сформирована.

    Такое применение массивов дает им совершенно новое содержание. Это предусмотрено синтаксисом PHP, но такое использование открывает широкие возможности.

    Предусмотрев методы визуализации, сохранения в базе данных, восстановления в рабочем состоянии (например) можно будет не задумываться о том, что делать в конкретном случае. Все загруженные файлы помещаются в массив последовательно, а когда идет его обработка, вызываются всегда одни и те же методы по одной и той же схеме, но файл картинки будет отображен как есть, файл электронной таблицы - как таблица, а документ - как соответствующий текст. Доступный посредством синтаксиса PHP последний элемент, массив оснащает своими свойствами и конкретным содержанием.

    В последнем случае документ всегда имеет символы, строки, числа и, что самое важное, форматирование. Уследить за каждым элементом сложно, но, предусмотрев для каждого элемента формата надлежащий объект, можно получить, не задумываясь, документ как есть.

    Стек и рекурсия в пределах синтаксиса

    Когда идет работа только с последним элементом, основное условие - это стек, но, когда этот элемент исполняется и в нем используется та же конструкция, а особенно он сам, - это рекурсия. Можно сказать много хорошего о библиотеках PHPOffice, например PHPWord, но утверждать, что они реализуют полноценный механизм, транслирующий исходное форматирование документа в результат, нельзя.

    Действительно, используя PHPOffice\PHPWord можно элементарно открыть любой вордовский документ (*.docx), но это всего лишь архив множества структурированных xml-файлов, рисунков, объектов и др.

    При этом, если взять только xml-файлы, хотя они взаимосвязаны (в части стилей, таблицы, рисунков), не получится сформировать новый документ на основе старого и просто перенести в него желаемые изменения (например, изменить шрифт, цвета, форматирование). Вариантов применения тегов Open XML множество, и даже столь отлаженный продукт, как MS Word, не всегда справляется с идеями пользователя, допуская ошибки.

    Собственно *.docx файл - это zip-архив, причем четкой и понятной структуры. Используя небольшое количество объектов, можно формально описать его и получить в момент чтения полноценную, самостоятельную структуру данных, которой можно будет управлять семантически.

    В данном случае информация в документе - формальная структура данных. Придав ей динамику, можно легко перейти на уровень смысла и абстрагироваться от синтаксиса.