Удалить все элементы массива с помощью нечисловых ключей

У меня есть массив, который выглядит примерно так:

Array
(
    [0] => apple
    ["b"] => banana
    [3] => cow
    ["wrench"] => duck
)

Я хочу взять этот массив и использовать array_filter или что-то подобное, чтобы удалить элементы с нечисловыми ключами и получить следующий массив:

Array
(
    [0] => apple
    [3] => cow
)

Я думал об этом и не мог придумать, как это сделать, потому что array_filter не предоставляет моей функции ключ, а array_walk не может изменить структуру массива (об этом говорится в руководстве по PHP).

 hafichuk15 июн. 2012 г., 01:06
Имеет ли значение, является ли ключ строковым представлением числа? то есть"0"
 diracdeltafunk15 июн. 2012 г., 01:07
Предпочтительно, я хотел бы исключить этот случай, просто потому, что он кажется более правильным, но это не имеет значения в моем текущем приложении.
 user55784615 июн. 2012 г., 01:09
делать больше работы, чем необходимо, никогда не бывает «более правильным»

Ответы на вопрос(4)

array_filter в компактной форме:

array_filter($array, function ($k) { return is_numeric($k); }, ARRAY_FILTER_USE_KEY);

Demo.

Этот подход примерно на 20% медленнее, чемfor цикл на моем боксе (1,61 с против 1,31 с для 1M итераций).

 20 окт. 2016 г., 01:56
Вы также можете просто передать имя функции в виде строки. То естьarray_filter($array, "is_numeric", ARRAY_FILTER_USE_KEY);
Решение Вопроса

foreach цикл был бы уместен в этом случае:

foreach ($arr as $key => $value) {
    if (!is_int($key)) {
        unset($arr[$key]);
    }
}
 diracdeltafunk15 июн. 2012 г., 01:09
Это выглядит потрясающе, и спасибо за быстрый ответ. Я попробую это

foreach($arr as $key => $value) {
    if($key !== 0 and !intval($key)) {
         unset($arr[$key]);
    }
}
 15 июн. 2012 г., 01:09
Потому что! Intval (0), это правда.
 15 июн. 2012 г., 01:08
Почему$key !== 0

one (долго)line:

$a = array_intersect_key($a, array_flip(array_filter(array_keys($a), 'is_numeric')));
What it does: Since array_filter works with values, array_keys first creates a new array with the keys as values (ignoring the original values). These are then filtered by the is_numeric function. The result is then flipped back so the keys are keys once again. Finally, array_intersect_key only takes the items from the original array having a key in the result of the above (the numeric keys).

Не спрашивайте меня о производительности.

 29 авг. 2015 г., 15:24
Какую ошибку вы получаете? Как вы можете видеть здесь, это похоже на работу:3v4l.org/aj9FD
 10 мар. 2016 г., 11:54
ради правды,array_filter на самом деле это петля. Вы не «пишете» петля, но внутренне это так.
 25 мар. 2015 г., 11:29
действительно класс, я люблю ваше решение!
 19 февр. 2018 г., 10:43
Если вы решите использовать этот ответ, имейте в виду, что, несмотря наarray_intersect_key сis_numeric фильтр, вы можете просто использоватьis_string фильтр.
 29 авг. 2015 г., 12:13
Как я могу проверить ключ массива не числовой. Я пытаюсь с функцией is_string в обратном вызове array_filter, но получаю ошибку

Ваш ответ на вопрос