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

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

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

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

Q&A

解決済

1回答

1716閲覧

PHPのarray_spliceについて

gsuisk

総合スコア72

PHP

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

0グッド

0クリップ

投稿2017/09/06 17:19

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

(1)

PHP

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

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

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

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

(2)

PHP

1$input = array("red", "green", "blue", "yellow"); 2array_splice($input, -1, 1, array("black", "maroon")); 3//ここでは $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)

PHP

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

(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/06 18:02

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gsuisk

2017/09/07 16:25

ありがとうございます。とてもわかりやすかったです! 一つ疑問なのですが、(1)でarray_splice($input, 1, -1)の-1は、 「インデックス番号1の値(green)から、末尾から1つ戻った箇所(blue)まで削除」ということですが、 -1が末尾を表すのなら ("red", "green", "blue", "yellow")は末尾の"yellow"まで削除対象になってしまいませんか?
gsuisk

2017/09/07 17:29

他の例だと echo mb_strimwidth("ABCDEFGHIJK", 0, -4, "...");   // ABCD... となる この場合、第三引数widthが負の場合は、末尾の K を -1 とするので H が -4 にあたりますよね?
gsuisk

2017/09/07 17:32

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

退会済みユーザー

2017/09/07 20: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, ""); も確認してみてください。
gsuisk

2017/09/08 06:00

理解しました! 第3引数のlengthやwidthが負の値の時は、 例えば -1 だったら、「末端の値からから1戻った箇所まで」という意味なのですね。 (末端の値「以下」ではなく「未満」の部分というのでしょうか...) 第2引数であるoffsetやstartが負の値の場合は、-1 を末端の値とするので、これと混同していました。 ありがとうございました。もしこの認識も誤っていたらご返信いただけると助かります。
退会済みユーザー

退会済みユーザー

2017/09/08 06:09

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

2017/09/08 06:42

確かに、-1を最後の値と考えて数えるよりも、区切って位置で考えれば以下とか未満とか考える必要ないですね。 位置のイメージとてもわかりやすいです!本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問