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, isNotEmpty, NULL, ZEND_ACC_PUBLIC)
|
||||||
PHP_ME(Collection, keys, NULL, ZEND_ACC_PUBLIC)
|
PHP_ME(Collection, keys, NULL, ZEND_ACC_PUBLIC)
|
||||||
PHP_ME(Collection, last, predicate_arginfo, 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, map, transform_arginfo, ZEND_ACC_PUBLIC)
|
||||||
PHP_ME(Collection, mapKeys, transform_arginfo, ZEND_ACC_PUBLIC)
|
PHP_ME(Collection, mapKeys, transform_arginfo, ZEND_ACC_PUBLIC)
|
||||||
PHP_ME(Collection, mapKeysTo, destination_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)
|
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)
|
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)
|
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)
|
PHP_METHOD(Collection, init)
|
||||||
|
@ -958,6 +1003,24 @@ PHP_METHOD(Collection, last)
|
||||||
RETVAL_NULL();
|
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)
|
PHP_METHOD(Collection, map)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -1361,7 +1424,7 @@ PHP_METHOD(Collection, slice)
|
||||||
|
|
||||||
PHP_METHOD(Collection, sort)
|
PHP_METHOD(Collection, sort)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PHP_METHOD(Collection, sortBy)
|
PHP_METHOD(Collection, sortBy)
|
||||||
|
|
|
@ -52,6 +52,7 @@ PHP_METHOD(Collection, isEmpty);
|
||||||
PHP_METHOD(Collection, isNotEmpty);
|
PHP_METHOD(Collection, isNotEmpty);
|
||||||
PHP_METHOD(Collection, keys);
|
PHP_METHOD(Collection, keys);
|
||||||
PHP_METHOD(Collection, last);
|
PHP_METHOD(Collection, last);
|
||||||
|
PHP_METHOD(Collection, lastIndexOf);
|
||||||
PHP_METHOD(Collection, map);
|
PHP_METHOD(Collection, map);
|
||||||
PHP_METHOD(Collection, mapKeys);
|
PHP_METHOD(Collection, mapKeys);
|
||||||
PHP_METHOD(Collection, mapKeysTo);
|
PHP_METHOD(Collection, mapKeysTo);
|
||||||
|
|
|
@ -389,6 +389,14 @@ class Collection implements ArrayAccess, Countable
|
||||||
*/
|
*/
|
||||||
function last($predicate) {}
|
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
|
* Returns a collection containing the results of applying the given transform function
|
||||||
* to each element in the original collection.
|
* 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