質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.02%

  • PHP

    17758questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

PHPのarray_spliceについて

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 184

gsuisk

score 59

array_spliceのマニュアルでわからない点が3つあります。

(1)

$input = array("red", "green", "blue", "yellow");
array_splice($input, 1, -1);
// ここでは $input は array("red", "yellow") となる

配列$inputのインデックス番号1("green")から-1の長さ分を削除?という意味だと思うのですが、第3引数lengthが負のときの意味がわかりません。

負の length が指定された場合、削除される部分の末尾の位置は配列の末尾を基準にして計算されます。


ここではなぜ["red", "yellow"]となるのでしょうか?

(2)

$input = array("red", "green", "blue", "yellow");
array_splice($input, -1, 1, array("black", "maroon"));
//ここでは $input は array("red", "green", "blue", "black", "maroon") となる


第2引数はoffsetです。

offsetが負の場合、削除される部分は、inputの末尾から数えた位置からとなります。


この場合、offsetが-1なので

["red", "green", "blue", "yellow"]の末尾の1番目である"yellow"を削除し、
array("black", "maroon")に代替している。

ということだと思いますが、末尾からの数え方は配列のように0番目からではなく、-1番目が末尾の値と考えて良いのですか?

(3)

$input = array("red", "green", "blue", "yellow");
array_splice($input, 3, 0, "purple");
// ここでは $input は array("red", "green","blue", "purple", "yellow"); となる
 length にゼロを指定した場合は、どの要素も削除しません。

("red", "green", "blue", "yellow")で、インデックス番号3の値は"yellow"ですが
この場合のイメージとしては、
3番目の値を削除しないが代替する=3番目の値を挿入するために、現在3番目にある"yellow"に後ろに下がってもらう。このような感覚で良いでしょうか?

教えていただければ幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+3

(1) 

配列$inputのインデックス番号1("green")から-1の長さ分を削除?

ここの認識が違います。
第三引数は「配列の一番末尾(つまり"yellow")」を基準に計算されます。
日本語で書くと、array_splice($input, 1, -1)は、
$input の先頭(”red”)から 1 進んだ箇所から、末尾(つまり"yellow")から 1
戻った箇所まで(つまり"green", "blue")を削除します。

(2)

末尾からの数え方は配列のように0番目からではなく、-1番目が末尾の値と考えて良いのですか?

はい。正しいです。

(3)

3番目の値を削除しないが代替する=3番目の値を挿入するために、現在3番目にある"yellow"に後ろに下がってもらう。このような感覚で良いでしょうか?

変に読み替えないで、マニュアルに記載の通り

offset および length で何も削除しないと指定した場合、配列 replacement の要素は offset で指定された位置に挿入されます。 

で理解したほうが良いです。

位置の指定の仕方は、下記のようにイメージすると理解しやすいと思います。

 |"red"|"green"|"blue"|"yellow"|
 0     1       2      3        4
-4    -3      -2     -1        0

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/08 01:25

    ありがとうございます。とてもわかりやすかったです!

    一つ疑問なのですが、(1)でarray_splice($input, 1, -1)の-1は、
    「インデックス番号1の値(green)から、末尾から1つ戻った箇所(blue)まで削除」ということですが、
    -1が末尾を表すのなら

    ("red", "green", "blue", "yellow")は末尾の"yellow"まで削除対象になってしまいませんか?

    キャンセル

  • 2017/09/08 02:29

    他の例だと

    echo mb_strimwidth("ABCDEFGHIJK", 0, -4, "...");   // ABCD... となる

    この場合、第三引数widthが負の場合は、末尾の K を -1 とするので H が -4 にあたりますよね?

    キャンセル

  • 2017/09/08 02:32

    array_splice()の第3引数であるlengthも同じように考えれば、 -1 が末尾ではないのでしょうか?

    キャンセル

  • 2017/09/08 05:45 編集

    mb_strimwidth の挙動を勘違いしてないですか?

    echo mb_strimwidth("ABCDEFGHIJK", 0, -4, "...");
    echo PHP_EOL;
    echo mb_strimwidth("ABCDEFGHIJK", 0, -4, "");

    で勘違いが解消される気がします。

    $a=[1,2,3,4,5];
    var_dump(array_splice($a, 1, -1));
    echo mb_strimwidth("12345", 1, -1, "");

    も確認してみてください。

    キャンセル

  • 2017/09/08 15:00

    理解しました!

    第3引数のlengthやwidthが負の値の時は、

    例えば -1 だったら、「末端の値からから1戻った箇所まで」という意味なのですね。
    (末端の値「以下」ではなく「未満」の部分というのでしょうか...)

    第2引数であるoffsetやstartが負の値の場合は、-1 を末端の値とするので、これと混同していました。

    ありがとうございました。もしこの認識も誤っていたらご返信いただけると助かります。

    キャンセル

  • 2017/09/08 15:09

    私の理解もソースを読んだものではないので、マニュアルと動作結果からでしかありませんが、そこから判断するとあっていると思います。
    位置のイメージは、私が回答の最後に記述したものが、結構分かりやすいと思います。あれであれば、誤解することもなくなく理解できるかと。

    キャンセル

  • 2017/09/08 15:42

    確かに、-1を最後の値と考えて数えるよりも、区切って位置で考えれば以下とか未満とか考える必要ないですね。

    位置のイメージとてもわかりやすいです!本当にありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    17758questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。