この記事では、主に PHP ソースコードに関する簡単な説明その 22 について紹介します。array_splice 関数については、必要な友人に参照してもらえるように共有します。 # PHP ソース コードに関する簡単な説明 22: array_splice 関数について
array_splice(PHP 4, PHP 5)
array_splice - 配列の一部を削除し、他の値に置き換えます
array array_splice (array &input, int offset [, int length [, array replace]] )
array_splice() 入力配列の offset と length で指定されたセルを削除します。パラメータが指定されている場合は、置換配列内のセルを使用します。削除されたセルを含む配列を返します。入力内の数値キー名は保持されないことに注意してください。
オフセットが正の場合、入力配列の値で指定されたオフセットから削除が開始されます。 offset が負の場合、入力の末尾からこの値で指定されたオフセットで削除が開始されます。
長さを省略した場合、オフセットから末尾までの配列のすべての部分が削除されます。長さが指定されており、それが正の場合、この数のセルが削除されます。 length が指定され、負の場合、配列の末尾からカウントダウンした offset から length までのすべての要素が削除されます。ヒント: 置換が指定されたときに、オフセットから配列の末尾までのすべての要素を削除するには、長さとして count($input) を使用します。
置換配列が指定された場合、削除されたセルはこの配列内のセルに置き換えられます。オフセットと長さの組み合わせによって値が削除されない場合、置換配列内の要素はオフセットで指定された位置に挿入されます。置換配列内のキー名は保持されないことに注意してください。置換に使用される値が単なるユニットの場合、ユニット自体が配列でない限り、それに array() を追加する必要はありません。
array_splice 関数は php_splice 関数を呼び出します。この関数の内容は次のとおりです。
/* 创建并初始化返回数组,此返回数组为php_splice的返回数组,并非array_splice的返回数组(array_splice的返回数组为removed)*/ALLOC_HASHTABLE(out_hash); zend_hash_init(out_hash, 0, NULL, ZVAL_PTR_DTOR, 0);/*将数组中从开始到offset的元素拷贝到返回数组中 */for (pos=0, p=in_hash->pListHead; pos<offset && p ; pos++, p=p->pListNext) { entry = *((zval **)p->pData); entry->refcount++;/*更新返回数组 */if (p->nKeyLength) zend_hash_quick_update(out_hash, p->arKey, p->nKeyLength, p->h, &entry, sizeof(zval *), NULL);else zend_hash_next_index_insert(out_hash, &entry, sizeof(zval *), NULL);}/* 将需要移除的元素赋值给removed,即array_splice的返回数组 */if (removed != NULL) { for ( ; pos<offset+length && p; pos++, p=p->pListNext) { entry = *((zval **)p->pData); entry->refcount++; if (p->nKeyLength) zend_hash_quick_update(*removed, p->arKey, p->nKeyLength, p->h, &entry, sizeof(zval *), NULL); else zend_hash_next_index_insert(*removed, &entry, sizeof(zval *), NULL); }} else /* 其它情况,跳过这些元素 */ for ( ; pos<offset+length && p; pos++, p=p->pListNext);/* 如果有元素需要插入,即有replacement参数 */if (list != NULL) {/* 对于每个元素,创建新的zval,拷贝并将它写入到返回数组中*/ for (i=0; i<list_count; i++) { entry = *list[i]; entry->refcount++; zend_hash_next_index_insert(out_hash, &entry, sizeof(zval *), NULL); }}/* 拷贝剩下的元素 */for ( ; p ; p=p->pListNext) { entry = *((zval **)p->pData); entry->refcount++; if (p->nKeyLength) zend_hash_quick_update(out_hash, p->arKey, p->nKeyLength, p->h, &entry, sizeof(zval *), NULL); else zend_hash_next_index_insert(out_hash, &entry, sizeof(zval *), NULL);} /* 重置数组的游标,相当于reset函数*/zend_hash_internal_pointer_reset(out_hash);
プロセス全体:
1. 開始からオフセットまでの要素を戻り配列にコピーします。2. オフセットからオフセット+長さまでの要素を削除します。 ##3. 置換された要素がある場合は、オフセット後の位置に新しい要素を挿入します##4。返された配列の後ろに関数を挿入します
5。 ##以上がこの記事の全内容です。皆様の学習にお役に立てれば幸いです。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。
関連する推奨事項:
概要PHP ソースコードに関するディスカッションその 21 : array_flip、array_reverse 関数について
以上がPHP ソース コード 22 についての簡単な説明: array_splice 関数についての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。