Add `indexOf()`, `lastIndexOf()`, `indexOfFirst()` and `indexOfLast()`.
This commit is contained in:
parent
441ca5be72
commit
4fce31a10f
|
@ -166,6 +166,7 @@ const zend_function_entry collection_methods[] = {
|
|||
PHP_ME(Collection, isNotEmpty, NULL, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Collection, keys, NULL, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Collection, last, predicate_arginfo, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Collection, lastIndexOf, element_arginfo, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Collection, map, transform_arginfo, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Collection, mapKeys, transform_arginfo, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Collection, mapKeysTo, destination_transform_arginfo, ZEND_ACC_PUBLIC)
|
||||
|
|
|
@ -872,17 +872,62 @@ PHP_METHOD(Collection, groupByTo)
|
|||
|
||||
PHP_METHOD(Collection, indexOf)
|
||||
{
|
||||
|
||||
zval* element;
|
||||
ZEND_PARSE_PARAMETERS_START(1, 1)
|
||||
Z_PARAM_ZVAL(element)
|
||||
ZEND_PARSE_PARAMETERS_END();
|
||||
zend_array* current = COLLECTION_FETCH_CURRENT();
|
||||
INIT_EQUAL_CHECK_FUNC(element);
|
||||
ZEND_HASH_FOREACH_BUCKET(current, Bucket* bucket)
|
||||
if (equal_check_func(element, &bucket->val)) {
|
||||
if (bucket->key)
|
||||
RETURN_STR(bucket->key);
|
||||
RETURN_LONG(bucket->h);
|
||||
}
|
||||
ZEND_HASH_FOREACH_END();
|
||||
RETVAL_NULL();
|
||||
}
|
||||
|
||||
PHP_METHOD(Collection, indexOfFirst)
|
||||
{
|
||||
|
||||
zend_fcall_info fci;
|
||||
zend_fcall_info_cache fcc;
|
||||
ZEND_PARSE_PARAMETERS_START(1, 1)
|
||||
Z_PARAM_FUNC(fci, fcc)
|
||||
ZEND_PARSE_PARAMETERS_END();
|
||||
INIT_FCI(1);
|
||||
zend_array* current = COLLECTION_FETCH_CURRENT();
|
||||
ZEND_HASH_FOREACH_BUCKET(current, Bucket* bucket)
|
||||
ZVAL_COPY_VALUE(¶ms[0], &bucket->val);
|
||||
zend_call_function(&fci, &fcc);
|
||||
if (zend_is_true(&retval)) {
|
||||
if (bucket->key)
|
||||
RETURN_STR(bucket->key);
|
||||
RETURN_LONG(bucket->h);
|
||||
}
|
||||
ZEND_HASH_FOREACH_END();
|
||||
RETVAL_NULL();
|
||||
}
|
||||
|
||||
PHP_METHOD(Collection, indexOfLast)
|
||||
{
|
||||
|
||||
zend_fcall_info fci;
|
||||
zend_fcall_info_cache fcc;
|
||||
ZEND_PARSE_PARAMETERS_START(1, 1)
|
||||
Z_PARAM_FUNC(fci, fcc)
|
||||
ZEND_PARSE_PARAMETERS_END();
|
||||
INIT_FCI(1);
|
||||
zend_array* current = COLLECTION_FETCH_CURRENT();
|
||||
ZEND_HASH_REVERSE_FOREACH_BUCKET(current, Bucket* bucket)
|
||||
ZVAL_COPY_VALUE(¶ms[0], &bucket->val);
|
||||
zend_call_function(&fci, &fcc);
|
||||
if (zend_is_true(&retval)) {
|
||||
if (bucket->key)
|
||||
RETURN_STR(bucket->key);
|
||||
RETURN_LONG(bucket->h);
|
||||
}
|
||||
ZEND_HASH_FOREACH_END();
|
||||
RETVAL_NULL();
|
||||
}
|
||||
|
||||
PHP_METHOD(Collection, init)
|
||||
|
@ -958,6 +1003,24 @@ PHP_METHOD(Collection, last)
|
|||
RETVAL_NULL();
|
||||
}
|
||||
|
||||
PHP_METHOD(Collection, lastIndexOf)
|
||||
{
|
||||
zval* element;
|
||||
ZEND_PARSE_PARAMETERS_START(1, 1)
|
||||
Z_PARAM_ZVAL(element)
|
||||
ZEND_PARSE_PARAMETERS_END();
|
||||
zend_array* current = COLLECTION_FETCH_CURRENT();
|
||||
INIT_EQUAL_CHECK_FUNC(element);
|
||||
ZEND_HASH_REVERSE_FOREACH_BUCKET(current, Bucket* bucket)
|
||||
if (equal_check_func(element, &bucket->val)) {
|
||||
if (bucket->key)
|
||||
RETURN_STR(bucket->key);
|
||||
RETURN_LONG(bucket->h);
|
||||
}
|
||||
ZEND_HASH_FOREACH_END();
|
||||
RETVAL_NULL();
|
||||
}
|
||||
|
||||
PHP_METHOD(Collection, map)
|
||||
{
|
||||
|
||||
|
|
|
@ -52,6 +52,7 @@ PHP_METHOD(Collection, isEmpty);
|
|||
PHP_METHOD(Collection, isNotEmpty);
|
||||
PHP_METHOD(Collection, keys);
|
||||
PHP_METHOD(Collection, last);
|
||||
PHP_METHOD(Collection, lastIndexOf);
|
||||
PHP_METHOD(Collection, map);
|
||||
PHP_METHOD(Collection, mapKeys);
|
||||
PHP_METHOD(Collection, mapKeysTo);
|
||||
|
|
|
@ -389,6 +389,14 @@ class Collection implements ArrayAccess, Countable
|
|||
*/
|
||||
function last($predicate) {}
|
||||
|
||||
/**
|
||||
* Returns last key of element, or null if the collection does not contain element.
|
||||
*
|
||||
* @param mixed $element
|
||||
* @return int|string|null
|
||||
*/
|
||||
function lastIndexOf($element) {}
|
||||
|
||||
/**
|
||||
* Returns a collection containing the results of applying the given transform function
|
||||
* to each element in the original collection.
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
--TEST--
|
||||
Test Collection::indexOf(), Collection::lastIndexOf(), Collection::indexOfFirst(), Collection::indexOfLast().
|
||||
--FILE--
|
||||
<?php
|
||||
$collection = Collection::init(['t', 'B', 13, 'f', 'G', 19, 'N', 'f']);
|
||||
$first_f_at = $collection->indexOf('f');
|
||||
if ($first_f_at != 3)
|
||||
echo 'Collection::indexOf() failed.', PHP_EOL;
|
||||
$last_f_at = $collection->lastIndexOf('f');
|
||||
if ($last_f_at != 7)
|
||||
echo 'Collection::lastIndexOf() failed.', PHP_EOL;
|
||||
$first_numeric_at = $collection->indexOfFirst(function ($value) {
|
||||
return is_numeric($value);
|
||||
});
|
||||
if ($first_numeric_at != 2)
|
||||
echo 'Collection::indexOfFirst() failed.', PHP_EOL;
|
||||
$last_upper_case_at = $collection->indexOfLast(function ($value) {
|
||||
return ctype_upper($value);
|
||||
});
|
||||
if ($last_upper_case_at != 6)
|
||||
echo 'Collection::indexOfLast() failed.', PHP_EOL;
|
||||
?>
|
||||
--EXPECT--
|
Reference in New Issue