目次
[PHP源码阅读]array_slice和array_splice函数,slicesplice
array_slice
参数说明
offset
length
preserve_keys
使用实例
运行步骤
源码解读
总结
ホームページ php教程 php手册 [PHP源码阅读]array_slice和array_splice函数,slicesplice

[PHP源码阅读]array_slice和array_splice函数,slicesplice

Jun 13, 2016 am 08:38 AM
array

[PHP源码阅读]array_slice和array_splice函数,slicesplice

array_slice和array_splice函数是用在取出数组的一段切片,array_splice还有用新的切片替换原删除切片位置的功能。类似javascript中的Array.prototype.splice和Array.prototype.slice方法。

我在github上有对PHP源码更详细的注解。感兴趣的可以围观一下,给个star。PHP5.4源码注解。可以通过commit记录查看已添加的注解。

array_slice

<p>array array_slice ( array $array , int $offset [, int $length = NULL [, bool $preserve_keys = false ]] )</p>
ログイン後にコピー

返回数组中指定下标offset和长度length的子数组切片。

参数说明

设第一个参数数组的长度为num_in。

offset

如果offset是正数且小于length,则返回数组会从offset开始;如果offset大于length,则不操作,直接返回。如果offset是负数,则offset = num_in+offset,如果num_in+offset == 0,则将offset设为0。

length

如果length小于0,那么会将length转为num_in - offset + length;否则,如果offset+length > array_count,则length = num_in - offset。如果处理后length还是小于0,则直接返回。

preserve_keys

默认是false,默认不保留数字键值原顺序,设为true的话会保留数组原来的数字键值顺序。

使用实例

<?<span>php
</span><span>$input</span> = <span>array</span>("a", "b", "c", "d", "e"<span>);

</span><span>$output</span> = <span>array_slice</span>(<span>$input</span>, 2);      <span>//</span><span> returns "c", "d", and "e"</span>
<span>$output</span> = <span>array_slice</span>(<span>$input</span>, -2, 1);  <span>//</span><span> returns "d"</span>
<span>$output</span> = <span>array_slice</span>(<span>$input</span>, 0, 3);   <span>//</span><span> returns "a", "b", and "c"</span>

<span>print_r</span>(<span>array_slice</span>(<span>$input</span>, 2, -1)); <span>//</span><span> array(0 => 'c', 1 => 'd');</span>
<span>print_r</span>(<span>array_slice</span>(<span>$input</span>, 2, -1, <span>true</span>)); <span>//</span><span> array(2 => 'c', 1 => 'd');</span>
ログイン後にコピー

运行步骤

<p>处理参数:offset、length</p>
<p>移动指针到offset指向的位置</p>
<p>从offset开始,拷贝length个元素到返回数组</p>
ログイン後にコピー

运行流程图如下

php $input = array("red", "green", "blue", "yellow"); array_splice($input, 2); // $input变为 array("red", "green") $input = array("red", "green", "blue", "yellow"); array_splice($input, 1, -1); // $input变为 array("red", "yellow") $input = array("red", "green", "blue", "yellow"); array_splice($input, 1, count($input), "orange"); // $input变为 array("red", "orange") $input = array("red", "green", "blue", "yellow"); array_splice($input, -1, 1, array("black", "maroon")); // $input为 array("red", "green", // "blue", "black", "maroon") $input = array("red", "green", "blue", "yellow"); array_splice($input, 3, 0, "purple"); // $input为 array("red", "green", // "blue", "purple", "yellow");

源码解读

在array_splice中,有这么一段代码:

    <span>/*</span><span> Don't create the array of removed elements if it's not going
     * to be used; e.g. only removing and/or replacing elements </span><span>*/</span>
    <span>if</span> (return_value_used) { <span>//</span><span> 如果有用到函数返回值则创建返回数组,否则不创建返回数组</span>
        <span>int</span> size =<span> length;

        </span><span>/*</span><span> Clamp the offset.. </span><span>*/</span>
        <span>if</span> (offset ><span> num_in) {
            offset </span>=<span> num_in;
        } </span><span>else</span> <span>if</span> (offset < <span>0</span> && (offset = (num_in + offset)) < <span>0</span><span>) {
            offset </span>= <span>0</span><span>;
        }

        </span><span>/*</span><span> ..and the length </span><span>*/</span>
        <span>if</span> (length < <span>0</span><span>) {
            size </span>= num_in - offset +<span> length;
        } </span><span>else</span> <span>if</span> (((unsigned <span>long</span>) offset + (unsigned <span>long</span>) length) ><span> (unsigned) num_in)         {
            size </span>= num_in -<span> offset;
        }

        </span><span>/*</span><span> Initialize return value </span><span>*/</span><span>
        array_init_size(return_value, size </span>> <span>0</span> ? size : <span>0</span><span>);
        rem_hash </span>= &<span>Z_ARRVAL_P(return_value);
    }</span>
ログイン後にコピー

array_splice函数返回的是被删除的切片。这段代码的意思是,如果array_splice需要返回值,那么才创建返回数组,否则不创建,以免浪费空间。这也是一个编程小技巧,仅当需要的时候才返回。比如在函数中使用$result = array_splice(...),那么return_value_used就是true。

总结

到此本文结束,在平时编程中,应当像这两个函数实现时的做法一样,将最特殊的情况先处理掉,然后再继续,以免做了多余的判断;有需要保存新变量的时候才申请新的空间,不然会造成浪费。

 

原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

如果本文对你有帮助,请点下推荐吧,谢谢^_^

 

最后再安利一下,我在github有对PHP源码更详细的注解。感兴趣的可以围观一下,给个star。PHP5.4源码注解。可以通过commit记录查看已添加的注解。

更多源码文章,欢迎访问个人主页继续查看:hoohack

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C# の Array.Sort 関数を使用して配列を並べ替える C# の Array.Sort 関数を使用して配列を並べ替える Nov 18, 2023 am 10:37 AM

タイトル: Array.Sort 関数を使用して C# で配列を並べ替える例 本文: C# では、配列は一般的に使用されるデータ構造であり、多くの場合、配列を並べ替える必要があります。 C# には Array クラスが用意されており、このクラスには配列を簡単に並べ替えるための Sort メソッドがあります。この記事では、C# で Array.Sort 関数を使用して配列を並べ替える方法を示し、具体的なコード例を示します。まず、Array.Sort 関数の基本的な使用法を理解する必要があります。 Array.So

PHPのarray_merge_recursive()関数を使用するシンプルで明確な方法 PHPのarray_merge_recursive()関数を使用するシンプルで明確な方法 Jun 27, 2023 pm 01:48 PM

PHP でプログラミングする場合、多くの場合、配列をマージする必要があります。 PHP には、配列のマージを完了するための array_merge() 関数が用意されていますが、配列内に同じキーが存在する場合、この関数は元の値を上書きします。この問題を解決するために、PHP は配列をマージして同じキーの値を保持できる array_merge_recursive() 関数を言語で提供し、プログラム設計をより柔軟にします。配列マージ

PHP で array_combine 関数を使用して 2 つの配列を結合して連想配列にする方法 PHP で array_combine 関数を使用して 2 つの配列を結合して連想配列にする方法 Jun 26, 2023 pm 01:41 PM

PHP には、配列操作をより便利かつ高速にする強力な配列関数が多数あります。 2 つの配列を結合して連想配列にする必要がある場合、PHP の array_combine 関数を使用してこの操作を実行できます。この関数は、実際には、ある配列のキーを別の配列の値として新しい連想配列に結合するために使用されます。次に、PHP の array_combine 関数を使用して 2 つの配列を結合して連想配列にする方法を説明します。 array_comb について学ぶ

PHPのarray_fill()関数の使い方の詳しい説明 PHPのarray_fill()関数の使い方の詳しい説明 Jun 27, 2023 am 08:42 AM

PHP プログラミングにおいて、配列は大量のデータを簡単に処理できる非常に重要なデータ構造です。 PHP は配列関連の関数を多数提供しており、array_fill() はその 1 つです。この記事では、array_fill() 関数の使い方と実際の応用におけるヒントを詳しく紹介します。 1. array_fill() 関数の概要 array_fill() 関数の機能は、同じ値で構成される指定された長さの配列を作成することです。具体的には、この関数の構文は次のとおりです。

Python で Array モジュールを使用する方法 Python で Array モジュールを使用する方法 May 01, 2023 am 09:13 AM

Python の配列モジュールは事前定義された配列であるため、標準のリストよりもメモリ内で使用するスペースがはるかに少なく、追加、削除、インデックス付け、スライスなどの要素レベルの操作を高速に実行することもできます。さらに、配列内のすべての要素は同じ型であるため、平均値、最大値、最小値の計算など、配列が提供する効率的な数値演算関数を使用できます。さらに、配列モジュールは、配列オブジェクトのバイナリ ファイルへの直接の書き込みと読み取りもサポートしているため、大量の数値データを処理する際の効率が向上します。したがって、大量の同種データを処理する必要がある場合は、Python の配列モジュールを使用してコードの実行効率を最適化することを検討してください。配列モジュールを使用するには、まず次のことを行う必要があります。

PHP の array_change_key_case() 関数の使用方法の概要 PHP の array_change_key_case() 関数の使用方法の概要 Jun 27, 2023 am 10:43 AM

PHP プログラミングでは、配列は頻繁に使用されるデータ型です。 array_change_key_case() 関数など、多数の配列操作関数もあります。この関数は、配列内のキー名の大文字と小文字を変換して、データ処理を容易にすることができます。この記事では、PHP での array_change_key_case() 関数の使用方法を紹介します。 1. 関数の構文とパラメータ array_change_ke

Java での ArrayStoreException の一般的な原因は何ですか? Java での ArrayStoreException の一般的な原因は何ですか? Jun 25, 2023 am 09:48 AM

Java プログラミングでは、配列は重要なデータ構造です。配列は 1 つの変数に複数の値を格納できます。さらに重要なのは、インデックスを使用して各値にアクセスできることです。ただし、配列を操作しているときに、いくつかの例外が発生する場合があります。そのうちの 1 つは ArrayStoreException です。この記事では、ArrayStoreException 例外の一般的な原因について説明します。 1. 型の不一致 配列の作成時に要素の型を指定する必要があります。互換性のないデータ型を配列に格納しようとすると、

Java での ArrayIndexOutOfBoundsException の一般的な原因は何ですか? Java での ArrayIndexOutOfBoundsException の一般的な原因は何ですか? Jun 24, 2023 pm 10:39 PM

Java は、さまざまな開発分野で広く使用されている非常に強力なプログラミング言語です。ただし、Java プログラミング中に、開発者は ArrayIndexOutOfBoundsException 例外に遭遇することがよくあります。では、この異常の一般的な原因は何でしょうか? ArrayIndexOutOfBoundsException は、Java の一般的なランタイム例外です。これは、データにアクセスするときに、配列の添字が配列の範囲を超えていることを意味します。一般的な理由には次のようなものがあります。

See all articles