array_keys($arr) and array_keys($arr, NULL) should behave differently
In Zend, the latter form only returns keys which have a NULL (or NULL-like if $strict==false) value. The former returns all keys.
Esse commit está contido em:
@@ -777,7 +777,7 @@ Variant Array::key(CVarRef search_value, bool strict /* = false */) const {
|
||||
|
||||
Array Array::keys(CVarRef search_value /* = null_variant */,
|
||||
bool strict /* = false */) const {
|
||||
if (search_value.isNull()) {
|
||||
if (!search_value.isInitialized()) {
|
||||
ArrayInit ai(size(), ArrayInit::vectorInit);
|
||||
for (ArrayIter iter(*this); iter; ++iter) {
|
||||
ai.set(iter.first());
|
||||
|
||||
@@ -115,6 +115,12 @@ class Array : protected ArrayBase {
|
||||
}
|
||||
bool valueExists(CVarRef search_value, bool strict = false) const;
|
||||
Variant key(CVarRef search_value, bool strict = false) const;
|
||||
|
||||
/**
|
||||
* Note that search_value == null_variant will return all keys,
|
||||
* while search_value == init_null_variant will return only keys
|
||||
* for pairs where the value is a PHP NULL. (or null-like if strict is false)
|
||||
*/
|
||||
Array keys(CVarRef search_value = null_variant, bool strict = false) const;
|
||||
Array values() const;
|
||||
|
||||
|
||||
@@ -2180,6 +2180,13 @@ bool TestCodeRun::TestArray() {
|
||||
"test(1);"
|
||||
"var_dump('three');");
|
||||
|
||||
MVCR("<?php "
|
||||
"$a = array('a' => null, 'b' => 123, 'c' => false);"
|
||||
"var_dump(array_keys($a));"
|
||||
"var_dump(array_keys($a, null));"
|
||||
"var_dump(array_keys($a, null, true));"
|
||||
);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -356,6 +356,39 @@ bool TestExtArray::test_array_keys() {
|
||||
")\n");
|
||||
}
|
||||
|
||||
{
|
||||
Array array = CREATE_MAP3(
|
||||
"a", init_null_variant,
|
||||
"b", 123,
|
||||
"c", false);
|
||||
VS(f_print_r(f_array_keys(array), true),
|
||||
"Array\n"
|
||||
"(\n"
|
||||
" [0] => a\n"
|
||||
" [1] => b\n"
|
||||
" [2] => c\n"
|
||||
")\n");
|
||||
VS(f_print_r(f_array_keys(array, init_null_variant), true),
|
||||
"Array\n"
|
||||
"(\n"
|
||||
" [0] => a\n"
|
||||
" [1] => c\n"
|
||||
")\n");
|
||||
// null_variant is uninitialized, so it should act like not passing a value
|
||||
VS(f_print_r(f_array_keys(array, null_variant), true),
|
||||
"Array\n"
|
||||
"(\n"
|
||||
" [0] => a\n"
|
||||
" [1] => b\n"
|
||||
" [2] => c\n"
|
||||
")\n");
|
||||
VS(f_print_r(f_array_keys(array, init_null_variant, true), true),
|
||||
"Array\n"
|
||||
"(\n"
|
||||
" [0] => a\n"
|
||||
")\n");
|
||||
}
|
||||
|
||||
return Count(true);
|
||||
}
|
||||
|
||||
|
||||
Referência em uma Nova Issue
Bloquear um usuário