diff --git a/src/collections_methods.c b/src/collections_methods.c index 44ff5d0..7e7b150 100644 --- a/src/collections_methods.c +++ b/src/collections_methods.c @@ -1419,7 +1419,29 @@ PHP_METHOD(Collection, single) PHP_METHOD(Collection, slice) { - + zval* elements; + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_ZVAL(elements) + ZEND_PARSE_PARAMETERS_END(); + ELEMENTS_VALIDATE(elements, ERR_BAD_ARGUMENT_TYPE, return); + zend_array* current = COLLECTION_FETCH_CURRENT(); + ARRAY_NEW_EX(sliced, current); + ZEND_HASH_FOREACH_VAL(elements_arr, zval* val) + if (Z_TYPE_P(val) == IS_LONG) { + zval* found = zend_hash_index_find(current, Z_LVAL_P(val)); + if (found) { + Z_TRY_ADDREF_P(found); + zend_hash_next_index_insert(sliced, found); + } + } else if (Z_TYPE_P(val) == IS_STRING) { + zval* found = zend_hash_find(current, Z_STR_P(val)); + if (found) { + Z_TRY_ADDREF_P(found); + zend_hash_add(sliced, Z_STR_P(val), found); + } + } + ZEND_HASH_FOREACH_END(); + RETVAL_NEW_COLLECTION(sliced); } PHP_METHOD(Collection, sort) diff --git a/stubs/Collection.php b/stubs/Collection.php index 1fd06a7..8d4fd7f 100644 --- a/stubs/Collection.php +++ b/stubs/Collection.php @@ -745,6 +745,7 @@ class Collection implements ArrayAccess, Countable * Returns a list containing elements at specified keys. * * @param array|Collection $keys + * @return Collection */ function slice($keys) {} diff --git a/tests/036-slice.phpt b/tests/036-slice.phpt new file mode 100644 index 0000000..ec3b550 --- /dev/null +++ b/tests/036-slice.phpt @@ -0,0 +1,12 @@ +--TEST-- +Test Collection::slice(). +--FILE-- +slice([2, -1, 3, 6]); +$array1 = ['a' => 'b', 'c' => 'd', 'e' => 'f']; +$collection1 = Collection::init($array1)->slice(['c', 'a', 'g']); +if ($collection->toArray() != [3, 4] || $collection1->toArray() != ['c' => 'd', 'a' => 'b']) + echo 'Collection::slice() failed.', PHP_EOL; +?> +--EXPECT--