php array delete array element
PHP: удаление элемента из массива
Я думал, что установка его на null сделал бы это, но, видимо, это не работает.
30 ответов
существуют различные способы удаления элемента массива, где некоторые из них более полезны для определенных задач, чем другие.
удалить один элемент массива
также, если у вас есть значение и не знаете ключ для удаления элемента, вы можете использовать array_search() получить ключ.
unset() метод
обратите внимание, что при использовании unset() ключи массива не изменятся/reindex. Если вы хотите переиндексировать ключи вы можете использовать array_values() после unset() который преобразует все ключи в числовые перечисляемые ключи, начиная с 0.
array_splice() метод
если вы используете array_splice() ключи будут автоматически переиндексируется, но ассоциативные ключи не будут меняться в отличие от array_values() который преобразует все ключи в числовые ключи.
и array_splice() требуется смещение, а не ключ! в качестве второго параметра.
array_splice() же unset() принять массив по ссылке, это означает, что вы не хотите присвоить возвращаемые значения этих функций в массив.
удалить несколько элементы массива
если вы хотите удалить несколько элементов массива и не хочу называть unset() или array_splice() несколько раз, вы можете использовать функции array_diff() или array_diff_key() в зависимости от того, знаете ли Вы значения или ключи элементов, которые вы хотите удалить.
array_diff() метод
array_diff_key() метод
также, если вы хотите использовать unset() или array_splice() для удаления нескольких элементов с одинаковым значением можно использовать array_keys() чтобы получить все ключи для определенного значения, а затем удалить все элементы.
следует отметить, что unset() сохранит индексы нетронутыми, чего и следовало ожидать при использовании строковых индексов (массив в качестве хэш-таблицы), но может быть довольно удивительно при работе с целочисленными индексированными массивами:
так array_splice() может использоваться, если вы хотите нормализовать целочисленные ключи. Другой вариант-использовать array_values() после unset() :
это вывод из кода выше:
теперь array_values () красиво переиндексирует числовой массив, но удалит все ключевые строки из массива и заменит их числами. Если вам нужно сохранить имена ключей (строки) или переиндексировать массив, если все ключи числовые, используйте array_merge ():
Если у вас есть численно индексированный массив, где все значения уникальны (или они не уникальны, но вы хотите удалить все экземпляры определенного значения), вы можете просто использовать array_diff () для удаления соответствующего элемента, например:
это отображает следующее:
в этом примере элемент со значением ‘Charles’ удаляется, что может быть проверено вызовами sizeof (), которые сообщают размер 4 для исходный массив, и 3 после удаления.
также для именованного элемента:
уничтожить один элемент массива
unset()
Если вам нужно повторно индексировать массив:
mixed array_pop(array &$array)
mixed array_shift ( array &$array )
чтобы избежать поиска, можно поиграть с array_diff :
в этом случае не нужно искать/использовать ключ.
unset() уничтожает указанные переменные.
поведение unset() внутри функции может варьироваться в зависимости от типа переменной, которую вы пытаетесь уничтожить.
если глобализованная переменная unset() внутри функции уничтожается только локальная переменная. Переменная в вызывающей среде сохранит то же значение, что и раньше unset() называлась.
ответ вышеуказанного кода будет бар
до unset() глобальная переменная внутри функции
Если вам нужно удалить несколько значений в массиве, а записи в этом массиве являются объектами или структурированными данными, [array_filter][1] это ваш лучший ставку. Те записи, которые возвращают true из функции обратного вызова будут сохранены.
ассоциативные массивы
числовые массивы
Примечание
Если вам нужно удалить несколько элементов из ассоциативного массива, вы можете использовать array_diff_key () (здесь используется с array_flip ()):
Я просто хотел сказать, что у меня был определенный объект, который имел переменные атрибуты (это было в основном отображение таблицы, и я менял столбцы в таблице, поэтому атрибуты в объекте, отражающие таблицу, также будут отличаться
цель $fields было просто так, что мне не нужно смотреть везде в коде, когда они меняются, я просто смотрю в начале класса и меняю список атрибутов и $fields содержимое массива для отражения новых атрибутов.
Мне потребовалось некоторое время, чтобы понять это. Надеюсь, это может кому-то помочь.
следуйте функциям по умолчанию
Предположим, у вас есть такой массив:
а также вы получаете:
unset () несколько фрагментированных элементов из массива
хотя unset() упоминалось здесь несколько раз, еще не упоминалось, что unset () принимает несколько переменных, что упрощает удаление нескольких несмежных элементов из массива за одну операцию:
unset () динамически
unset() не принимает массив ключей для удаления, поэтому приведенный ниже код завершится ошибкой (это сделало бы его немного проще использовать unset() динамически хотя.)
вместо этого unset () можно использовать динамически в цикле foreach:
удалите ключи массива, скопировав массив
очевидно, что такая же практика применяется к текстовым строкам:
решения:
далее объяснение:
использование этих функций удаляет все ссылки на эти элементы из PHP. Если вы хотите сохранить ключ в массиве, но с пустым значением, присвоить пустую строку к элементу:
помимо синтаксиса, есть логическая разница между использованием unset () и присвоение » элементу. Первый говорит: This doesn’t exist anymore, в то время как второй говорит This still exists, but its value is the empty string.
если вы имеете дело с числами, присвоение 0 может быть лучшая альтернатива. Таким образом, если компания остановила производство звездочки модели XL1000, она обновит свой инвентарь с помощью:
однако, если у него временно закончились звездочки XL1000, но он планировал получить новую партию с завода позже на этой неделе, это лучше:
если вы unset () элемент, PHP настраивает массив так, чтобы цикл все еще работал правильно. Он не компактирует массив, чтобы заполнить недостающие отверстия. Этот это то, что мы имеем в виду, когда говорим, что все массивы ассоциативны, даже когда они кажутся числовыми. Вот пример:
чтобы сжать массив в плотно заполненный числовой массив, используйте array_values ():
кроме того, array_splice () автоматически оленей массивы, чтобы избежать оставляя отверстия:
это полезно, если вы используете массив в очереди и хотите, чтобы удалить элементы из очереди в то же время позволяя случайный доступ. Чтобы безопасно удалить первый или последний элемент из массива, используйте array_shift () и array_pop (), соответственно.
Remove empty array elements
Some elements in my array are empty strings based on what the user has submitted. I need to remove those elements. I have this:
27 Answers 27
You can use array_filter to remove empty elements:
If you have (int) 0 in your array, you may use the following:
EDIT: Maybe your elements are not empty per se but contain one or more spaces. You can use the following before using array_filter
The most popular answer on this topic is absolutely INCORRECT.
Consider the following PHP script:
Why is this? Because a string containing a single ‘0’ character also evaluates to boolean false, so even though it’s not an empty string, it will still get filtered. That would be a bug.
Passing the built-in strlen function as the filtering function will work, because it returns a non-zero integer for a non-empty string, and a zero integer for an empty string. Non-zero integers always evaluate to true when converted to boolean, while zero integers always evaluate to false when converted to boolean.
So, the absolute, definitive, correct answer is:
array_filter: «If no callback is supplied, all entries of input equal to FALSE will be removed.» This means that elements with values NULL, 0, ‘0’, », FALSE, array() will be removed too.
The other option is doing
which will remove elements with values NULL, » and FALSE.
UPDATE
Here is an example.
Another one liner to remove empty («» empty string) elements from your array.
Or maybe you want to trim your array elements first:
Note: This code also removes null and false elements.
In short:
This is my suggested code:
Explanation:
array_map is for trimming, array_filter is for remove empty values, strlen is for keep 0 value, and array_values is for re indexing if you needed.
Samples:
Results:
Online Test:
If you are working with a numerical array and need to re-index the array after removing empty elements, use the array_values function:
The most voted answer is wrong or at least not completely true as the OP is talking about blank strings only. Here’s a thorough explanation:
What does empty mean?
First of all, we must agree on what empty means. Do you mean to filter out:
How do you filter out the values
To filter out empty strings only:
To only filter out strictly false values, you must use a callback function:
Third and fourth case are (for our purposes at last) equivalent, and for that all you have to use is the default:
For multidimensional array
I had to do this in order to keep an array value of (string) 0
I use the following script to remove empty elements from an array
Just want to contribute an alternative to loops. also addressing gaps in keys.
In my case I wanted to keep sequential array keys when the operation was complete (not just odd numbers, which is what I was staring at. Setting up code to look just for odd keys seemed fragile to me and not future-friendly.)
The combination of array_filter and array_slice does the trick.
No idea on efficiencies or benchmarks but it works.
Just one line : Update (thanks to @suther):
output
use array_filter function to remove empty values:
Remove empty array elements
I think array_walk is much more suitable here
Output:
We made sure that empty values are removed even if the user adds more than one space
We also trimmed empty spaces from the valid values
Finally, only (null), (Boolean False) and (») will be considered empty strings
As for False it’s ok to remove it, because AFAIK the user can’t submit boolean values.
As per your method, you can just catch those elements in an another array and use that one like follows,
try this ** **Example
With these types of things, it’s much better to be explicit about what you want and do not want.
It will help the next guy to not get caught by surprise at the behaviour of array_filter() without a callback. For example, I ended up on this question because I forgot if array_filter() removes NULL or not. I wasted time when I could have just used the solution below and had my answer.
Also, the logic is language angnostic in the sense that the code can be copied into another language without having to under stand the behaviour of a php function like array_filter when no callback is passed.
In my solution, it is clear at glance as to what is happening. Remove a conditional to keep something or add a new condition to filter additional values.
Another benefit of this approach is that you can break apart the filtering predicates into an abstract function that filters a single value per array and build up to a composable solution.
See this example and the inline comments for the output.
Now you can dynamically create a function called filterer() using pipe() that will apply these partially applied functions for you.
How do you remove an array element in a foreach loop?
I want to loop through an array with foreach to check if a value exists. If the value does exist, I want to delete the element which contains it.
I have the following code:
I don’t know how to delete the element once the value is found. How do I delete it?
7 Answers 7
If you also get the key, you can delete that item like this:
A better solution is to use the array_filter function:
As foreach relies on the internal array pointer in PHP 5, changing it within the loop may lead to unexpected behavior.
In PHP 7, foreach does not use the internal array pointer.
Instead of doing foreach() loop on the array, it would be faster to use array_search() to find the proper key. On small arrays, I would go with foreach for better readibility, but for bigger arrays, or often executed code, this should be a bit more optimal:
if you have scenario in which you have to remove more then one values from the foreach array in this case you have to pass value by reference in for each: I try to explain this scenario:
in second loop you want to unset first loops entries dont come again in the iteration for performance purpose or else then unset from memory as well because in memory they present and will come in iterations.
There are already answers which are giving light on how to unset. Rather than repeating code in all your classes make function like below and use it in code whenever required. In business logic, sometimes you don’t want to expose some properties. Please see below one liner call to remove
Как удалить элемент массива в PHP?
Одним из мощнейших инструментов PHP-разработчика являются массивы. Если вы работали с массивами в других языках программирования (Delphi, Fortrain, C++), то помните, что везде массив надо объявлять, указывая размерность и тип элементов. В PHP всё обстоит иначе.
Дело в том, что в PHP массив не является линейным объектом. Это, по сути, хеш-массив, представляющий собой набор пар — ключей с их значениями.
Теперь давайте посмотрим, как удалять элементы из хеш-массива в PHP. В вышеупомянутых языках программирования для таких действий придётся создавать специальный объект, односвязный либо 2-связный список, бережно выделять и освобождать память, наблюдать за восстановлением связей в списке. Что касается PHP, то тут весь необходимый «менеджмент» спрятан, но всегда готов к применению.
1. Удаляем элемент массива в PHP
Чтобы удалить элемент в PHP, достаточно всего лишь знать его ключ — в таком случае удаление будет сведено к вызову функции unset() :
2. Как удалить 1-й элемент массива?
В нашем случае 1-й элемент удаляется, а элемент 5 => ‘b’, попадает под перенумерацию. Что касается элементов со строковыми ключами, то их перенумерация не затронет.
3. Как удалить последний элемент массива?
После удаления последнего элемента массива в PHP перенумерация оставшихся элементов не выполняется.
4. Как удалить пустые элементы из массива?
Итак, мы в цикле проверим каждый элемент массива, используя функцию empty() и удалим пустые элементы. Здесь важно понять, что строковый скаляр ‘0’ — тоже пустой элемент. А вот ’00’ пустым не является.
Очевидно, что данный способ более гибок.
5. Удаляем повторяющиеся элементы массива в PHP
Порой возникает необходимость удалить повторяющиеся элементы массива в PHP. Для решения этой задачи существует специальная функция под названием array_unique() :
Из кода видно, что функция удалила из PHP-массива повторяющиеся элементы. При этом функция имеет ещё один параметр, указывающий, как сравнивать элементы.
Возможные типы сравнения: • SORT_REGULAR — сравнение без преобразования типа элементов; • SORT_STRING — сравнение как строки; • SORT_NUMERIC — сравнение как чисел (пытаемся преобразовать в число); • SORT_LOCALE_STRING — сравнение как строки, но с учётом выбранного набора символов.
По умолчанию применяется SORT_STRING. Выбирая типы сравнения, помните, что это важно. Давайте изменим тип в прошлом примере на SORT_NUMERIC:
Во время сравнения все элементы массива были преобразованы к численному типу скаляра. В нашем случае это неизменно давало значение ноль, в результате чего у нас остался лишь первый элемент.
Хотите знать о PHP больше? Записывайтесь на курс «Backend-разработчик на PHP»!
PHP : Remove object from array
12 Answers 12
You can also use spl_object_hash to create a hash for the objects and use that as array key.
However, PHP also has a native Data Structure for Object collections with SplObjectStorage :
On a sidenote, PHP also has native interfaces for Subject and Observer.
I agree with the answers above, but for the sake of completeness (where you may not have unique IDs to use as a key) my preferred methods of removing values from an array are as follows:
Which are used in the following way:
I recommend using the ID (if you have one, anything that will be unique to that object should work within reason) of the object as the array key. This way you can address the object within the array without having to run through a loop or store the ID in another location. The code would look something like this:
For remove an object from a multi dimensional array you can use this:
With array_column you can specify your key column name:
And this will remove the indicated object.
If you want to remove one or more objects from array of objects (using spl_object_hash to determine if objects are the same) you can use this method:
Reading the Observer pattern part of the GoF book? Here’s a solution that will eliminate the need to do expensive searching to find the index of the object that you want to remove.
Summary
Build in a way to find the element before assigning the object to the array. Otherwise, you will have to discover the index of the object element first.
If you have a large number of object elements (or, even more than a handful), then you may need to resort to finding the index of the object first. The PHP function array_search() is one way to start with a value, and get the index/key in return.
Do be sure to use the strict argument when you call the function.
If the third parameter strict is set to true then the array_search() function will search for identical elements in the haystack. This means it will also perform a strict type comparison of the needle in the haystack, and objects must be the same instance.