Add `indexOf()`, `lastIndexOf()`, `indexOfFirst()` and `indexOfLast()`.

This commit is contained in:
CismonX 2018-07-15 00:11:02 +08:00
parent 441ca5be72
commit 4fce31a10f
5 changed files with 100 additions and 4 deletions

View File

@ -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)

View File

@ -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(&params[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(&params[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)
{
@ -1361,7 +1424,7 @@ PHP_METHOD(Collection, slice)
PHP_METHOD(Collection, sort)
{
}
PHP_METHOD(Collection, sortBy)

View File

@ -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);

View File

@ -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.

23
tests/035-index-of.phpt Normal file
View File

@ -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--