PHP字符串充当下面的数组,
$string='test string';
echo $string[0]; // print t
但是当我使用count
函数和字符串变量时,它只打印1
。
echo count($string); // print 1
任何人都能解释为什么会这样吗?
答案 0 :(得分:7)
$string[offset]
只是语法糖,可让您轻松访问字符串的特定字节。尽管语法与访问数组索引的语法相同,但并不意味着字符串以任何方式充当数组。 count
是一个适用于数组的函数,而不是字符串。
答案 1 :(得分:4)
当您将字符串组件作为数组访问时,运行时会检测您正在执行的操作并在给定位置拾取字符。这与其他语言的作用一致,是一种常见的捷径。
当你调用“count”时,PHP实际上做的是将它强制转换为数组(除非它实现countable
。尝试:
var_dump( (array)$string);
请参阅count:http://us1.php.net/count
的文档如果您正在寻找替代方案,strlen
将为您提供长度(以字节为单位),mb_strlen
将为您提供字符数的长度(在多个字符的情况下不同)字节字符集)
答案 2 :(得分:0)
原因是..好吧,让我直接将你链接到count函数的实际实现:https://github.com/php/php-src/blob/master/ext/standard/array.c(注意它包含在逻辑位置:array.c,因为它对数组/ countable真的意味着,不是字符串)。
PHP_FUNCTION(count)
{
zval *array;
long mode = COUNT_NORMAL;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|l", &array, &mode) == FAILURE) {
return;
}
switch (Z_TYPE_P(array)) {
case IS_NULL:
RETURN_LONG(0);
break;
case IS_ARRAY:
RETURN_LONG (php_count_recursive (array, mode TSRMLS_CC));
break;
case IS_OBJECT: {
#ifdef HAVE_SPL
zval *retval;
#endif
/* first, we check if the handler is defined */
if (Z_OBJ_HT_P(array)->count_elements) {
RETVAL_LONG(1);
if (SUCCESS == Z_OBJ_HT(*array)->count_elements(array, &Z_LVAL_P(return_value) TSRMLS_CC)) {
return;
}
}
#ifdef HAVE_SPL
/* if not and the object implements Countable we call its count() method */
if (Z_OBJ_HT_P(array)->get_class_entry && instanceof_function(Z_OBJCE_P(array), spl_ce_Countable TSRMLS_CC)) {
zend_call_method_with_0_params(&array, NULL, NULL, "count", &retval);
if (retval) {
convert_to_long_ex(&retval);
RETVAL_LONG(Z_LVAL_P(retval));
zval_ptr_dtor(&retval);
}
return;
}
#endif
}
default:
RETURN_LONG(1);
break;
}
}
正如你所看到的那样.. count函数实际上只对数组,spl countables和NULL(返回0)实现。其他任何东西都会返回int值:1。