本文目錄一覽:
- 1、php中count()函數的作用?
- 2、php中統計數組的長度是那個函數?
- 3、php count函數使用問題
- 4、php中計算二維數組中某一元素之和的函數是那個啊?謝謝……
- 5、PHP的count(數組)和strlen(字元串)的內部實現。
- 6、php如何計算數組的單元個數
php中count()函數的作用?
PHP中count() 函數表示:計算數組中元素的個數,或者計算對象中屬性的個數;
計算數組元素個數示例:
?php
$arr = array(“baidu”, “google”, “soso”);
echo count($arr);
//結果:3
?
計算對象中的屬性個數示例:
?php
class Person{
public $name;
public $age;
public function __construct(){
$this-name = ‘baiduzhidao’;
$this-age = ’10’;
}
function msg(){
echo “msg function.”;
}
}
//new 對象
$per= new Person();
//獲取對象屬性關聯數組
$var=get_object_vars($per);
//計算對象屬性個數
echo count($var);
//輸出結果為:2
?
php中統計數組的長度是那個函數?
您好,你的問題,我之前好像也遇到過,以下是我原來的解決思路和方法,希望能幫助到你,若有錯誤,還望見諒!展開全部
獲取一維數組:
count()和sizeof() 都可以直接統計一維數組長度。示例如下:
$arr = Array(‘0′,’1′,’2′,’3′,’4′,’5′,’6′,’7′,’8′,’9’); echo count($arr); // 輸出10
$arr = array(‘蘋果’,’香蕉’,’桔子’,’西瓜’,’梨’,’葡萄’); echo sizeof($arr); // 輸出6
獲取二維數組長度:
count()函數有兩個參數:
count($arr,COUNT_NORMAL); //默認,不檢測多維數組
count($arr,COUNT_RECURSIVE); //檢測多維數組
例子:
$arr = array(
0=array(‘name’=’kong’,’age’=’18’),
1=array(‘name’=’liang’,’age’=’30’)
);
count($arr) = 2;
count($arr,COUNT_RECURSIVE) = 6;非常感謝您的耐心觀看,如有幫助請採納,祝生活愉快!謝謝!
php count函數使用問題
如果你單純是要計算查詢出的行數
用$num
=
mysql_num_rows($R1);就可以了
如果是別的,加我BAIDU
HI吧,一起討論一下
其實你print_r($select);你就會發現你的數組是6個數據,因為mysql_fetch_array()的語法是這樣的
array
mysql_fetch_array
(
resource
result
[,
int
result_type]
)
也就是說第二個參數可以取三個值MYSQL_NUM,MYSQL_ASSOC,MYSQL_BOTH(默認)
他們的意思分別是鍵名取數字,鍵名取欄位名,全部
所以,你資料庫選擇了3個列,那$select等於就取了6個數據
(如:
[0]=1
[id]=1
[1]=2
[name]=2
[2]=3
[password]=3)
存入數組,如果是$select
=
mysql_fetch_array($R1,MYSQL_ASSOC),那麼count($select)就是3
(如:
[id]=1
[name]=2
[password]=3)
MYSQL_NUM同理
至於你說為什麼只計算出6,因為取數據值需要循環,即
while($row
=
mysql_fetch_array($R1,MYSQL_ASSOC))
{
$num
+=
count($row);
}
echo
$num;
$num應該就是你想要的結果
php中計算二維數組中某一元素之和的函數是那個啊?謝謝……
PHP數組的總結(很全面啊)
一、什麼是數組
數組就是一組數據的集合,把一系列數據組織起來,形成一個可操作的整體。數組的每個實體都包含兩項:鍵和值。
二、聲明數據
在PHP中聲明數組的方式主要有兩種:一是應用array()函數聲明數組,一是直接為數組元素賦值。
1array()函數聲明的數
一、什麼是數組
數組就是一組數據的集合,把一系列數據組織起來,形成一個可操作的整體。數組的每個實體都包含兩項:鍵和值。
二、聲明數據
在PHP中聲明數組的方式主要有兩種:一是應用array()函數聲明數組,一是直接為數組元素賦值。
1array()函數聲明的數組的方式array([mixed…])
參數mixed的語法為key=value
如,?php
$array=array(“1″=”編”,”2″=”程”,”3″=”詞”,”4″=”典”);
print_r($array);
echo
“br”;
echo
$array[1];
//注意:下標默認是從0開始
echo
$array[2];
echo
$array[3];
echo
$array[4];
?
2直接為數組元素賦值。如果在創建數組時不知所創建數組的大小,或在實際編寫程序時數組的大小可能發生變化,採用這種數組創建的方法較好。
如,?php
$array[1]=”I”;
$array[2]=”love”;
$array[3]=”PHP”;
print_r($array);
//輸出所創建數組的結構
?
三、數組的類型
PHP支持兩種數組:索引數組(indexed
array)和聯合數組(associative
array),前者使用數字作為鍵,後者使用字元串作為鍵。
四、輸出數組
在PHP中對數組元素輸出,可以通過echo和print語句來實現,但這隻能對數組中某一元素進行輸出;要將數組結構輸出則要使用print_r()函數,其語法:print_r(mixed
expression),參數expression為普通的整形、字元型或實型變數則輸出該變數本身,如果該參數為數組,則按一定鍵值和元素的順序顯示出該數組中的所有元素。
五、數組的構造
一維數組:
當一個數組的元素是變數時,則稱其為一維數組。
聲明一位數組:
類型說明符
數組名[常量表達式];
二維數組:
當一個數組的元素是一個一位數組時,則稱之為二維數組。
如,?php
$str
=
array
(
“網路編程語言”=array
(“PHP”,”JSP”,”ASP”),
“體育項目”=array
(“m”=”足球”,”n”=”籃球”));
print_r
(
$str)
;
?
六、遍曆數組
遍曆數組中的所有元素是常用的一種操作,在遍歷的過程中可以完成查詢或其他功能。在PHP中遍曆數組的方法有多種,下面介紹最常用的兩種方法。
1使用foreach結構遍曆數組;
2使用list()函數遍曆數組,list()函數僅能用於數字索引的數組,且數字索引從0開始。
例:綜合使用list()和each()認證用戶登錄:
?php
//輸出用戶登錄信息
while(list($name,$value)=each($_POST)){
if($name!=”submit”){
echo
“$name=$valuebr”;
}
}
?
七、統計數組元素個數
在PHP中,使用count()函數對數組中的元素個數進行統計,語法為:int
coun(mixed
array[,int
mode]),其中參數array為必要參數,mode為可選參數,若選中COUNT——RECURSIVE(或1),本函數將遞歸地對數組數組。如,
?php
$array
=
array(“php”
=
array(“PHP函數參考大全”,”PHP程序開發範例寶典”,”PHP資料庫系統開發完全手冊”),
“asp”
=
array(“ASP經驗技巧寶典”)
);
//聲明一個二維數組
echo
count($array,COUNT_RECURSIVE);//遞歸統計數組元素的個數,運行結果為6
?
八、數組排序
1使用sort()和rsort()分別對數組進行升序和降序,如,
?php
$array=array(5,26,37,18,9,42,88,66);
$array1=sort($array);
for($i=0;$icount($array);$i++){
echo
$array[$i].” “;
}
echo
“br”;
$array1=rsort($array);
for($i=0;$icount($array);$i++){
echo
$array[$i].” nbsp”;
}
?
運行結果:
5
9
18
26
37
42
66
88
88
66
42
37
26
18
9
5
2使用ksort()和asort()對關聯數組排序
如果使用了相關數組,在排序後還要保持關鍵字和值的排序一致,這是就需要使用ksort()和asort()函
數,如,
?php
$array=array(‘php’=1,’jsp’=2,’asp’=3);
ksort($array);
print_r($array);
echo
“br”;
asort($array);
print_r($array);
?
運行結果:
Array
(
[asp]
=
3
[jsp]
=
2
[php]
=
1
)
Array
(
[php]
=
1
[jsp]
=
2
[asp]
=
3
)
PHP的count(數組)和strlen(字元串)的內部實現。
翻了下PHP內核的定義,大概心中也有了答案了
count()和strlen()都是O(1)的時間複雜度
試想一下如果strlen()需要O(N)的複雜度那未免也太慢了,字元串長度起來的話伺服器不是要直接掛掉嗎
這兩個函數都是典型的空間換時間的做法
我們可以先看看zvalue的結構:
typedef union _zvalue_value {
long lval; /* long value */
double dval; /* double value */
struct {
char *val;
int len;
} str;
HashTable *ht; /* hash table value */
zend_object_value obj;
zend_ast *ast;
} zvalue_value;
這裡用的是一個聯合體,當變數類型是string類型的時候附加存儲多了一個len的整型變數,顯而易見需要取長度直接利用記錄值就可以了,自然就是O(1)
對於count()常用的參數類型應該為數組,對於繼承Countable的類暫不作討論
數組實現方式為Hashtable,直接看看他的結構吧
typedef struct _hashtable {
uint nTableSize; // hash Bucket的大小,最小為8,以2x增長。
uint nTableMask; // nTableSize-1 , 索引取值的優化
uint nNumOfElements; // hash Bucket中當前存在的元素個數,count()函數會直接返回此值
ulong nNextFreeElement; // 下一個數字索引的位置
Bucket *pInternalPointer; // 當前遍歷的指針(foreach比for快的原因之一)
Bucket *pListHead; // 存儲數組頭元素指針
Bucket *pListTail; // 存儲數組尾元素指針
Bucket **arBuckets; // 存儲hash數組
dtor_func_t pDestructor; // 在刪除元素時執行的回調函數,用於資源的釋放
zend_bool persistent; //指出了Bucket內存分配的方式。如果persisient為TRUE,則使用操作系統本身的內存分配函數為Bucket分配內存,否則使用PHP的內存分配函數。
unsigned char nApplyCount; // 標記當前hash Bucket被遞歸訪問的次數(防止多次遞歸)
zend_bool bApplyProtection;// 標記當前hash桶允許不允許多次訪問,不允許時,最多只能遞歸3次
#if ZEND_DEBUG
int inconsistent;
#endif
} HashTable;
count直接獲取nNumOfElements大小,所以也是O(1)
補充————————————————
count() 函數的定義在這裡
/* {{{ proto int count(mixed var [, int mode])
Count the number of elements in a variable (usually an array) */
PHP_FUNCTION(count)
{
zval *array;
zend_long mode = COUNT_NORMAL;
zend_long cnt;
zval *element;
ZEND_PARSE_PARAMETERS_START(1, 2)
Z_PARAM_ZVAL(array)
Z_PARAM_OPTIONAL
Z_PARAM_LONG(mode)
ZEND_PARSE_PARAMETERS_END();
switch (Z_TYPE_P(array)) {
case IS_NULL:
php_error_docref(NULL, E_WARNING, “Parameter must be an array or an object that implements Countable”);
RETURN_LONG(0);
break;
case IS_ARRAY:
if (mode != COUNT_RECURSIVE) {
//類型為數組時調用zend內核函數 zend_array_count()
cnt = zend_array_count(Z_ARRVAL_P(array));
} else {
cnt = php_count_recursive(Z_ARRVAL_P(array));
}
RETURN_LONG(cnt);
break;
case IS_OBJECT: {
zval retval;
/* 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))) {
return;
}
}
/* if not and the object implements Countable we call its count() method */
if (instanceof_function(Z_OBJCE_P(array), zend_ce_countable)) {
zend_call_method_with_0_params(array, NULL, NULL, “count”, retval);
if (Z_TYPE(retval) != IS_UNDEF) {
RETVAL_LONG(zval_get_long(retval));
zval_ptr_dtor(retval);
}
return;
}
/* If There’s no handler and it doesn’t implement Countable then add a warning */
php_error_docref(NULL, E_WARNING, “Parameter must be an array or an object that implements Countable”);
RETURN_LONG(1);
break;
}
default:
php_error_docref(NULL, E_WARNING, “Parameter must be an array or an object that implements Countable”);
RETURN_LONG(1);
break;
}
}
如果沒有特別指定mode參數為 COUNT_RECURSIVE 的話(即作遍歷),跳轉到 zend 的數組計數函數 zend_array_count()
#define zend_hash_num_elements(ht) \
(ht)-nNumOfElements
…
…
static uint32_t zend_array_recalc_elements(HashTable *ht)
{
zval *val;
uint32_t num = ht-nNumOfElements;
ZEND_HASH_FOREACH_VAL(ht, val) {
if (Z_TYPE_P(val) == IS_INDIRECT) {
if (UNEXPECTED(Z_TYPE_P(Z_INDIRECT_P(val)) == IS_UNDEF)) {
num–;
}
}
} ZEND_HASH_FOREACH_END();
return num;
}
ZEND_API uint32_t zend_array_count(HashTable *ht)
{
uint32_t num;
if (UNEXPECTED(ht-u.v.flags HASH_FLAG_HAS_EMPTY_IND)) {
num = zend_array_recalc_elements(ht);
if (UNEXPECTED(ht-nNumOfElements == num)) {
ht-u.v.flags = ~HASH_FLAG_HAS_EMPTY_IND;
}
} else if (UNEXPECTED(ht == EG(symbol_table))) {
num = zend_array_recalc_elements(ht);
} else {
num = zend_hash_num_elements(ht);
}
return num;
}
IS_REFERENCE:間接 zval 指的就是其真正的值是存儲在其他地方的。注意這個 IS_REFERENCE 類型是不同的,間接 zval 是直接指向另外一個 zval 而不是像 zend_reference 結構體一樣嵌入 zval。
只有當數組中有 HASH_FLAG_HAS_EMPTY_IND 這個 flag 時(間接zval)才會對數組進行遍歷校驗,其他情況下都是直接取 數組(hash table) 裡面的 nNumOfElements 的值,答案顯而易見了,就是O(1)
php如何計算數組的單元個數
//count函數有兩個參數:
//0(或COUNT_NORMAL)為默認,不檢測多維數組(數組中的數組);
//1(或COUNT_RECURSIVE)為檢測多維數組,
$arr=array(
0=array(‘title’ = ‘新聞1’, ‘viewnum’ = 123, ‘content’ = ‘內容1’),
1=array(‘title’ = ‘新聞2’, ‘viewnum’ = 99, ‘content’ = ‘內容2’)
);
echo ‘不統計多維數組:’.count($arr,0); echo ‘或用sizeof為’.sizeof($arr,0);
echo “br/”;
echo ‘統計多維數組:’.count($arr,1);echo ‘或用sizeof為’.sizeof($arr,1);
原創文章,作者:YVEF,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/133516.html