2017-02-02 10 views
2

В массиве произвольного порядка и ключей, как показано нижезначение Grab массив с ключами в заданном диапазоне - PHP 5.5

$myArray = array(
    1 => 'foo', 
    4 => 'bar', 
    6 => 'foobar', 
    24 => 'barfoo', 
    30 => 'fizz', 
    35 => 'buzz', 
    50 => 'fizzbuzz' 
); 

Как я могу получить отрезок массива с помощью ключевого диапазона, например, каждый элемент с ключом между 5 и 40

Что-то вроде array_range($myArray, 5, 40);

Ожидаемый результат: array(6 => 'foobar', 24 => 'barfoo', 30 => 'fizz', 35 => 'buzz')

Это похоже на How to use array_filter() to filter array keys?, но в этом случае я ограничен PHP 5.5.

+0

все значения массива уникальных или вы ожидаете дубликаты? – edcs

+1

Возможный дубликат [PHP: Как использовать массив \ _filter() для фильтрации ключей массива?] (Http://stackoverflow.com/questions/4260086/php-how-to-use-array-filter-to-filter- array-keys) –

+0

Вы можете array_flip() ваш массив (который меняет ключи и значения вокруг), array_filter() перевернутый массив, а затем array_flip() результат обратно. Конечно, это будет работать только на 100% с массивами, которые не содержат никаких повторяющихся значений, но если вы сможете удовлетворить это требование, тогда он должен работать. – GordonM

ответ

1

Просто перебирать массив и использовать условие, чтобы построить отфильтрованный массив (здесь предполагая диапазон включительно):

<?php 
$in = array(
    1 => 'foo', 
    4 => 'bar', 
    6 => 'foobar', 
    24 => 'barfoo', 
    30 => 'fizz', 
    35 => 'buzz', 
    50 => 'fizzbuzz' 
); 

$out = []; 
foreach($in as $k => $v) 
{ 
    if($k >= 5 && $k <= 40) { 
     $out[$k] = $v; 
    } 
} 
var_dump($out); 

Выход:

array (size=4) 
    6 => string 'foobar' (length=6) 
    24 => string 'barfoo' (length=6) 
    30 => string 'fizz' (length=4) 
    35 => string 'buzz' (length=4) 
+0

Правильный и рабочий, но принятый ответ гораздо более краток. – Eamonn

+0

Изобразительное. Хотя я бы стал более удобочитаемым. – Progrock

+0

Более понятный с первого взгляда, я дам вам это. – Eamonn

3

Определение диапазона ключей в массиве, а затем вычислить пересечение ключей:

$range = array_flip(range(5, 40)); 
$result = array_intersect_key($myArray, $range); 

Один лайнер:

$result = array_intersect_key($myArray, array_flip(range(5, 40))); 

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

$range = array_fill_keys(range(5, 40), 1); 

Если вам нужны определенные ключи, а не диапазон, просто определите массив ключей или значений и флип:

$range = array_flip(array(6, 24, 50)); 
//or 
$range = array(6=>1, 24=>1, 50=>1); 
+0

Это самый краткий ответ, но я все время сталкивался с проблемами с памятью :( – Eamonn

2

Если PHP версия находится под 5.6, обновить версию PHP - 5.5 is not even supported any longer. Если вы не можете обновить PHP, то ясно, что используется AbraCadaver's answer.

Для этого требуется PHP 5.6+, но был дан ответ до того, как в этом вопросе была уточнена версия PHP, поэтому я оставлю ее для справки.

Использование array_filter - до тех пор, как PHP версии выше 5.6:

$allowed_range = [ 'min' => 5, 'max' => 40 ]; 
$filtered = array_filter(
    $myArray, 
    function ($key) use ($allowed_ranged) { 
     return ($key >= $allowed_range[ 'min' ] && $key <= $allowed_range[ 'max' ]); 
    }, 
    ARRAY_FILTER_USE_KEY 
); 
+0

Я разработчик, а не системный администратор. Когда он находится под моим контролем, я исключительно использую PHP 7 как абсолютный минимум, но все не так. – Eamonn

+0

Приобретен для процветания. Любой, кто использует устаревший PHP, должен немедленно обновить. – Eamonn

+1

Понял - я помещал это здесь для будущих посетителей так же, как и все остальное, поэтому не какой-либо комментарий к вам или вашим навыкам! Я также разработчик, и знаю, что мы часто связываем наши руки ... –