24

PHP function array_slice() returns sequence of elements by offset like this:

// sample data
$a = array('a','b','c',100=>'aa',101=>'bb',102=>'cc'); 

// outputs empty array because offset 100 not defined
print_r(array_slice($a,100));

Current function arguments:

array_slice ( $array, $offset, $length, $preserve_keys) 

I need something like this:

array_slice ( $array, **$key**, $length, $preserve_keys) 

That outputs this according to above print_r:

array (
   100 => aa,
   101 => bb,
   102 => cc
)

3 Answers 3

19

To find the offset of the key, use array_search() to search through the keys, which can be retrieved with array_keys(). array_search() will return FALSE when the specified key (100) is not present in the array ($a).

$key = array_search(100, array_keys($a), true);
if ($key !== false) {
    $slice = array_slice($a, $key, null, true);
    var_export($slice);
}

Prints:

array (
  100 => 'aa',
  101 => 'bb',
  102 => 'cc',
)
Sign up to request clarification or add additional context in comments.

Comments

11

Returns parts of $array whose keys exist in the array $keys:

array_intersect_key($array,array_flip($keys));

2 Comments

Not sure if your answer answers the OP's question, but this is exactly what I've been googling for :)
@brett me too :)
3

Alternative solution

If you want to slice the array by using keys for the items you want to get, you could use the following custom function to do so:

function array_slice_keys($array, $keys = null) {
    if ( empty($keys) ) {
        $keys = array_keys($array);
    }
    if ( !is_array($keys) ) {
        $keys = array($keys);
    }
    if ( !is_array($array) ) {
        return array();
    } else {
        return array_intersect_key($array, array_fill_keys($keys, '1'));
    }
}

Usage:

$ar = [
    'key1' => 'a',
    'key2' => 'b',
    'key3' => 'c',
    'key4' => 'd',
    'key5' => 'e',
    'key6' => 'f',
];

// Get the values from the array with these keys:
$items = array_slice_keys( $ar, array('key2', 'key3', 'key5') );

Result:

Array
(
    [key2] => b
    [key3] => c
    [key5] => e
)

2 Comments

Why is $keys an optional argument? It seems odd that this function handles so many defensive cases of getting no keys, getting an array without keys, getting... an empty array?
+1 I prefer this over array_search answer because it's easier to add more keys this way. But you could've just answered array_intersect_key($array, array_fill_keys($keys, '1')) without the (unnecessary) function.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.