深入理解PHP之数组遍历顺序
程序员文章站
2024-01-17 17:53:10
...
比如:
- $arr['laruence'] = 'huixinchen';
- $arr['yahoo'] = 2007;
- $arr['baidu'] = 2008;
- foreach ($arr as $key => $val) {
- //结果是什么?
- }
- $arr[2] = 'huixinchen';
- $arr[1] = 2007;
- $arr[0] = 2008;
- foreach ($arr as $key => $val) {
- //现在结果又是什么?
- }
- typedef struct _hashtable {
- uint nTableSize; /* 散列表大小, Hash值的区间 */
- uint nTableMask; /* 等于nTableSize -1, 用于快速定位,相当于是取模 */
- uint nNumOfElements; /* HashTable中实际元素的个数 */
- ulong nNextFreeElement; /* 下个空闲可用位置的数字索引,执行$arr[]='xxx'时使用这个值 */
- Bucket *pInternalPointer; /* 内部位置指针, 会被reset, current这些遍历函数使用 */
- Bucket *pListHead; /* 头元素, 用于线性遍历 */
- Bucket *pListTail; /* 尾元素, 用于线性遍历 */
- Bucket **arBuckets; /* 实际的存储容器(Bucket **arBuckets定义一个指针数组的另一种方式) */
- dtor_func_t pDestructor;/* 元素的析构函数(指针) */
- zend_bool persistent;
- unsigned char nApplyCount; /* 循环遍历保护 */
- zend_bool bApplyProtection;
- #if ZEND_DEBUG
- int inconsistent;
- #endif
- } HashTable;
- $arr = array(1,2,3,4,5,);
- $arr[] = &$arr;
- var_export($arr); //Fatal error: Nesting level too deep - recursive dependency?
- typedef struct bucket {
- ulong h; /* 数字索引/hash值 */
- uint nKeyLength; /* 字符索引的长度 */
- void *pData; /* 数据,指向zval结构 */
- void *pDataPtr; /* 数据指针 */
- struct bucket *pListNext; /* 下一个元素, 用于线性遍历 */
- struct bucket *pListLast; /* 上一个元素, 用于线性遍历 */
- struct bucket *pNext; /* 处于同一个拉链中的下一个元素 */
- struct bucket *pLast; /* 处于同一拉链中的上一个元素 */
- char arKey[1]; /* 节省内存,方便初始化的技巧 */
- } Bucket;