diff --git a/src/collections_me.c b/src/collections_me.c index 72d46dc..49e128c 100644 --- a/src/collections_me.c +++ b/src/collections_me.c @@ -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) diff --git a/src/collections_methods.c b/src/collections_methods.c index c711482..44ff5d0 100644 --- a/src/collections_methods.c +++ b/src/collections_methods.c @@ -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) { @@ -1361,7 +1424,7 @@ PHP_METHOD(Collection, slice) PHP_METHOD(Collection, sort) { - + } PHP_METHOD(Collection, sortBy) diff --git a/src/php_collections_me.h b/src/php_collections_me.h index bb85252..ade62c4 100644 --- a/src/php_collections_me.h +++ b/src/php_collections_me.h @@ -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); diff --git a/stubs/Collection.php b/stubs/Collection.php index 1d2d3e1..1fd06a7 100644 --- a/stubs/Collection.php +++ b/stubs/Collection.php @@ -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. diff --git a/tests/035-index-of.phpt b/tests/035-index-of.phpt new file mode 100644 index 0000000..a99db7b --- /dev/null +++ b/tests/035-index-of.phpt @@ -0,0 +1,23 @@ +--TEST-- +Test Collection::indexOf(), Collection::lastIndexOf(), Collection::indexOfFirst(), Collection::indexOfLast(). +--FILE-- +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--