() рдФрд░ foreach () рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реВрдк рдЕрднрд┐рдЧрдо рдХреА рддреБрд▓рдирд╛

рдореИрдВ php рдХреА рд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреВрд░реНрдгрд╛рдВрдХ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рд╣реИ
$arr = array( $val1, $val2, ..., $valn ); 
рдЗрд╕ рд╕рд░рдгреА рдХреЛ рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
 foreach($arr as $k => $v ) {...} 
рдФрд░
 $n = count( $arr ); for($k = 0; $k < $n; $k++ ) {...} 

рдпрд╣ рдХрд╛рдлреА рд╕реНрдкрд╖реНрдЯ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрджрд┐ рддреЗрдЬ рдирд╣реАрдВ рд╣реИ, рддреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдзреАрдорд╛ рдирд╣реАрдВ рд╣реИред
рдЪрд▓рд┐рдП рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВред
- рдирд╣реАрдВред рдХреЛрдИ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдирд╣реАрдВред рдХреЗрд╡рд▓ рдХреЛрдб!

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рдзреАрдорд╛ рд╣реИ! рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ C рдФрд░ C++ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЕрдиреБрднрд╡ рд╣реИ, рдЬрд╣рд╛рдВ рд╕рд░рдгреА рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдПрдХ рд╕рд░рд▓ рд╕реВрдЪрдХ рдСрдлрд╕реЗрдЯ рд╣реИред
рдореИрдВрдиреЗ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЦреЛрдЬрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╣рд░ рдХреЛрдИ рдЕрдкрдиреЗ рд╣рд╛рде рдирд╣реАрдВ рдорд┐рд▓рд╛, рдЬреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рдерд╛ред

рддреЛ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ


рдЖрдЗрдП php рдореЗрдВ рдПрдХ рд╕рд░рдгреА рдХреЗ рдЖрдВрддрд░рд┐рдХ рднрд╛рдЧ рдХреЛ рджреЗрдЦреЗрдВ ред
рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ, Zend рдХреЛрд░ рдореЗрдВ, рдПрдХ рд╕рд░рдгреА рдХреЛ рдХрдИ рдкрд░рд╕реНрдкрд░ рд╕рдВрд░рдЪрдирд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

Bucket рд╕рдВрд░рдЪрдирд╛ рд╕рд░рдгреА рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП "рд╕реВрдЪрдХ" рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИ
 typedef struct bucket { ulong h; //    // (  ) uint nKeyLength; //   ( ) void *pData; //    // [   : (zval **)pos->pData ] void *pDataPtr; struct bucket *pListNext; //      struct bucket *pListLast; //      struct bucket *pNext; //      arBuckets struct bucket *pLast; //      arBuckets const char *arKey; //   ,    } Bucket; typedef Bucket* HashPosition; 

HashTable рд╕рдВрд░рдЪрдирд╛ - рдпрд╣ рдЖрдВрддрд░рд┐рдХ рдЕрднреНрдпрд╛рд╡реЗрджрди рдореЗрдВ рд╕реНрд╡рдпрдВ рд╕рд░рдгреА рд╣реИ:
 typedef struct _hashtable { uint nTableSize; uint nTableMask; uint nNumOfElements; //     ulong nNextFreeElement; Bucket *pInternalPointer; Bucket *pListHead; //      Bucket *pListTail; //      Bucket **arBuckets; // ,  . //      //     dtor_func_t pDestructor; zend_bool persistent; unsigned char nApplyCount; zend_bool bApplyProtection; } HashTable; 

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдЬрд╛рдирдХрд╛рд░реА рднреА рдХрд╛рд░рдг рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдПрд░реЗ рдХреЛ рджреЛрдЧреБрдиреА рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рдВрджреЗрд╣ рд╕реЗ рдЬреБрдбрд╝реА рд╕реВрдЪрд┐рдпрд╛рдБ рддреНрд╡рд░рд┐рдд рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВ, рдмрд▓реНрдХрд┐ рддреНрд╡рд░рд┐рдд рдЦреЛрдЬ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рд▓рд┐рдП рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкрд╣реБрдБрдЪ рдПрдХ рдзреАрдорд╛ рдСрдкрд░реЗрд╢рди рд╣реИред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдЦрд┐рд░рдХрд╛рд░, Zend рдПрдХ рдПрд░реЗ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреИрд╕реЗ рдкреБрдирд░рд╛рд╡реГрддреНрдд рд╣реЛрддрд╛ рд╣реИред

 //     . int zend_hash_move_forward_ex(HashTable *ht, HashPosition *pos) { HashPosition *current = pos ? pos : &ht->pInternalPointer; if (*current) { *current = (*current)->pListNext; return SUCCESS; } else return FAILURE; } //     . //  php   ,    Zend //       . int zend_hash_move_backwards_ex(HashTable *ht, HashPosition *pos) { HashPosition *current = pos ? pos : &ht->pInternalPointer; if (*current) { *current = (*current)->pListLast; return SUCCESS; } else return FAILURE; } 

рдпрд╣рд╛рдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЖрдЧреЗ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рдмрд┐рдирд╛ рд╕рдмрдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ - рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХ рдХреЛ рдПрдХ рд╕реВрдЪрдХ рджреНрд╡рд╛рд░рд╛ рдЕрдЧрд▓реЗ рддрддреНрд╡ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕ рд▓рд┐рдВрдХ рдХреЛ рд╡рд░реНрддрдорд╛рди рдПрдХ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЗрдВрдбреЗрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдХреИрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
 int zend_hash_index_find(const HashTable *ht, ulong h, void **pData) { uint nIndex; Bucket *p; nIndex = h & ht->nTableMask; p = ht->arBuckets[nIndex]; while (p != NULL) { if ((p->h == h) && (p->nKeyLength == 0)) { *pData = p->pData; return SUCCESS; } p = p->pNext; } return FAILURE; } 

рдХреБрдЫ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рд╣реИрдВред
рдореИрдВ рдкрд╛рдардХреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдмреЛрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдХрд┐ рдХреИрд╕реЗ arBuckets рд╕рд░рдгреА рдХреА arBuckets рдХреА arBuckets ( C HashPosition рд╕реЗ C рд╕рд░рдгреА рд╣реИ - Bucket рд╕рдВрдХреЗрдд)ред
рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдБ рдХрд┐ рдпрд╣рд╛рдБ arBuckets рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдЖрдВрддрд░рд┐рдХ рд╣реИрд╢ рдХрд╛ рднрд╛рдЧ arBuckets рдЬрдм рддрдХ рдХрд┐ рд╡рд╛рдВрдЫрд┐рдд рдорд╛рди рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


 foreach($arr as $i => $v ){...} 
рд╕рд░рдгреА рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рддреЗрдЬрд╝реА рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдПрдХ-рдПрдХ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдУ (рдПрди) рд╣реИред

 for($i = 0; $i < $n; $i++ ){...} 
рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░, рдпрд╣ рдЖрдВрддрд░рд┐рдХ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИред

рдЕрдиреБрдорд╛рдирд┐рдд рд░реВрдк рд╕реЗ, рдкрд┐рдЫрд▓реЗ рдСрдкрд░реЗрд╢рди рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдкреНрд░рдЧрддрд┐ n * (n + 1) / 2 рдЕрд░реНрдерд╛рдд рдХреЗ рдпреЛрдЧ рджреНрд╡рд╛рд░рд╛ рд╡реНрдпрдХреНрдд рдХреА рдЬрд╛рдПрдЧреАред рдФрд░ рдпрд╣ O (n 2 ) рдХреЗ рдХреНрд░рдо рдХрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдореВрд▓реНрдп рдХреА рдЦреЛрдЬ рдХрд░рддреЗ рд╕рдордп рд╕рдВрдкреВрд░реНрдг рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рднреА рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЪрдпрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдЯрд┐рд▓рддрд╛ O (n) рд╕реЗ O (n 2 ) рддрдХ рднрд┐рдиреНрди рд╣реЛрдЧреАред рдФрд░ рдмрдбрд╝реЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ O (n) рдХреЗ рдХрд░реАрдм рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рднреА, рдореБрдЦреНрдп рдкрд╣реБрдВрдЪ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдПрдХ рдЕрдзрд┐рдХ рд╕рдВрд╕рд╛рдзрди-рдЧрд╣рди рдСрдкрд░реЗрд╢рди рд╣реИред

рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреБрдВрдЬреА (рдпрд╛ рдорд┐рд╢реНрд░рд┐рдд - рдкреВрд░реНрдгрд╛рдВрдХ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ) рдХреЗ рд╕рд╛рде рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗ рд░реВрдк рдореЗрдВред
рдЙрдкрд░реНрдпреБрдХреНрдд рд╕рднреА рдЙрдирдХреЗ рд▓рд┐рдП рдЗрд╕ рдЕрдВрддрд░ рдХреЗ рд╕рд╛рде рднреА рд╕рд╣реА рд╣реИрдВ рдХрд┐ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреБрдВрдЬреА рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЧрддрд┐ рдФрд╕рддрди 8 (рдЕрдзрд┐рдХрддрдо 16) рдмрд╛рд░ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ

Source: https://habr.com/ru/post/In216103/


All Articles