SlideShare ist ein Scribd-Unternehmen logo
1 von 31
PHP
array_uintersectに潜む罠
array_intersect
配列の共通項を計算する
配列の共通項を計算する
$arr1 = ['foo', 'bar', 'baz'];
$arr2 = ['foo', 'baz'];
array_intersect($arr1, $arr2);
// ['foo', 'baz']
注意
二つの要素は、
(string) $elem1 === (string) $elem2 の場合のみ
等しいとみなされます。
言い換えると、文字列表現が同じ場合となります。
多次元配列の比較ができない
そこでarray_uintersect
配列の共通項を計算する(コールバック)
配列の共通項を計算する(コールバック)
$arr1 = [
['key' => 'foo'],
['key' => 'bar'],
['key' => 'baz'],
];
$arr2 = [
['key' => 'foo'],
['key' => 'baz'],
];
array_uintersect($arr1, $arr2, $someFunc);
// [['key' => 'foo'], ['key' =>'baz']]
比較関数について
比較関数は、
最初の引数と二番目の引数の比較結果を返します。
最初の引数のほうが二番目の引数より大きい場合は正の数を、
二番目の引数と等しい場合はゼロを、
そして二番目の引数より小さい場合は負の数を返す
必要があります。
???
比較?比較ナンデ?
0のとき等しい、俺は詳しいんんだ
$someFunc = function($a, $b) {
if ($a['key'] === $b['key']) {
return 0;
}
};
array_uintersect($arr1, $arr2, $someFunc);
グワーッ!!
$someFunc = function($a, $b) {
if ($a['key'] === $b['key']) {
return 0;
}
};
array_uintersect($arr1, $arr2, $someFunc);
// [
// ['key' => 'foo'],
// ['key' => 'bar'],
// ['key' => 'baz'],
// ]
罠1: 関数はきちんと書くべし
せいかいのかきかた
$someFunc = function($a, $b) {
if ($a['key'] === $b['key']) {
return 0;
}
if ($a['key'] > $b['key']) {
return 1;
}
return -1;
};
結構応用できるのでは?
部分一致を試してみる
$someFunc = function($a, $b) {
if (strpos($a, $b) !== false) {
return 0;
}
if ($a > $b) {
return 1;
}
return -1;
};
部分一致を試してみる
$arr1 = ['foo', 'bar', 'bazfoo', 'fooqux'];
$arr2 = ['foo'];
array_uintersect($arr1, $arr2, $someFunc);
グワーッ!!
$arr1 = ['foo', 'bar', 'bazfoo', 'fooqux'];
$arr2 = ['foo'];
array_uintersect($arr1, $arr2, $someFunc);
// [
// 'bazfoo',
// ]
罠2: 内部では
入力をソートしている
かつごうったってそうはいかねえ
$someFunc = function($a, $b) {
echo "{$a} <=> {$b}" . PHP_EOL;
if ($a == $b) {
return 0;
}
if ($a > $b) {
return 1;
}
return -1;
};
かつごうったってそうはいかねえ
$arr1 = [1, 3, 5];
$arr2 = [2, 4];
array_uintersect($arr1, $arr2, $someFunc);
グワーッ!!
3 <=> 1
5 <=> 3
4 <=> 2
1 <=> 2
3 <=> 2
3 <=> 2
3 <=> 4
5 <=> 4
5 <=> 4
グワーッ!!
3 <=> 1
5 <=> 3
4 <=> 2
// 明らかに入力をソートしている
1 <=> 2
3 <=> 2
3 <=> 2
3 <=> 4
5 <=> 4
5 <=> 4
……どうしてこんなことするの
多分計算量節約のため。
……どうしてこんなことするの
多分計算量節約のため。
入力をソートする初期コストはかかるが、
ソート済み配列を辿るならば
自分より小さいまたは一致する要素の次に
自分より大きい要素が来た場合、
それ以上辿っても自分と一致する要素はないことがわかる。
……どうしてこんなことするの
多分計算量節約のため。
入力をソートする初期コストはかかるが、
ソート済み配列を辿るならば
自分より小さいまたは一致する要素の次に
自分より大きい要素が来た場合、
それ以上辿っても自分と一致する要素はないことがわかる。
これにより全要素対全要素の比較をしなくてよくなり、
特に要素が多い場合の計算量が抑えられる。
……どうしてこんなことするの
多分計算量節約のため。
入力をソートする初期コストはかかるが、
ソート済み配列を辿るならば
自分より小さいまたは一致する要素の次に
自分より大きい要素が来た場合、
それ以上辿っても自分と一致する要素はないことがわかる。
これにより全要素対全要素の比較をしなくてよくなり、
特に要素が多い場合の計算量が抑えられる。
比較関数が完全でないといけない理由は、
最初のソートに使うため。
つまりは
こんなことには使えない:
一致の有無がソート順では判断できない場合。
ex. 文字列の部分一致
こんなことには使える:
一致の有無がソート順で判断できる場合。
ex. 文字列の前方一致
罠を知って楽しい
array_uintersectライフを!

Weitere ähnliche Inhalte

Was ist angesagt?

俺のフックがこんなに簡単なわけがない。
俺のフックがこんなに簡単なわけがない。俺のフックがこんなに簡単なわけがない。
俺のフックがこんなに簡単なわけがない。
Hishikawa Takuro
 
C++11概要 ライブラリ編
C++11概要 ライブラリ編C++11概要 ライブラリ編
C++11概要 ライブラリ編
egtra
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
時響 逢坂
 
すごいH 第12章モノイド
すごいH 第12章モノイドすごいH 第12章モノイド
すごいH 第12章モノイド
Shinta Hatatani
 
Hachiojipm #5 LT資料 [テーマ:最近いいなと思ったもの]
Hachiojipm #5 LT資料 [テーマ:最近いいなと思ったもの] Hachiojipm #5 LT資料 [テーマ:最近いいなと思ったもの]
Hachiojipm #5 LT資料 [テーマ:最近いいなと思ったもの]
norry_gogo
 

Was ist angesagt? (20)

俺のフックがこんなに簡単なわけがない。
俺のフックがこんなに簡単なわけがない。俺のフックがこんなに簡単なわけがない。
俺のフックがこんなに簡単なわけがない。
 
Elixirだ 第2回
Elixirだ 第2回Elixirだ 第2回
Elixirだ 第2回
 
C++11概要 ライブラリ編
C++11概要 ライブラリ編C++11概要 ライブラリ編
C++11概要 ライブラリ編
 
Elixirだ 第1回 - 基礎だ -
Elixirだ 第1回 - 基礎だ -Elixirだ 第1回 - 基礎だ -
Elixirだ 第1回 - 基礎だ -
 
Swift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdotsSwift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdots
 
PHPのタイプヒンティング
PHPのタイプヒンティングPHPのタイプヒンティング
PHPのタイプヒンティング
 
Elixirだ 第1回強化版 後半
Elixirだ 第1回強化版 後半Elixirだ 第1回強化版 後半
Elixirだ 第1回強化版 後半
 
Elixirだ 第1回強化版 前半
Elixirだ 第1回強化版 前半Elixirだ 第1回強化版 前半
Elixirだ 第1回強化版 前半
 
Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorpSwift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 
Swift 3.0 の新機能 - 追加・変更まわりだけ、ざっくり紹介 2 #devsap
Swift 3.0 の新機能 - 追加・変更まわりだけ、ざっくり紹介 2 #devsapSwift 3.0 の新機能 - 追加・変更まわりだけ、ざっくり紹介 2 #devsap
Swift 3.0 の新機能 - 追加・変更まわりだけ、ざっくり紹介 2 #devsap
 
"What Does Your Code Smell Like?"で学ぶPerl6
"What Does Your Code Smell Like?"で学ぶPerl6"What Does Your Code Smell Like?"で学ぶPerl6
"What Does Your Code Smell Like?"で学ぶPerl6
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 
モナドがいっぱい!
モナドがいっぱい!モナドがいっぱい!
モナドがいっぱい!
 
Ruby 同好会宣言
Ruby 同好会宣言Ruby 同好会宣言
Ruby 同好会宣言
 
F#のすすめ
F#のすすめF#のすすめ
F#のすすめ
 
40分濃縮 PHP classの教室
40分濃縮 PHP classの教室40分濃縮 PHP classの教室
40分濃縮 PHP classの教室
 
すごいH 第12章モノイド
すごいH 第12章モノイドすごいH 第12章モノイド
すごいH 第12章モノイド
 
Hachiojipm #5 LT資料 [テーマ:最近いいなと思ったもの]
Hachiojipm #5 LT資料 [テーマ:最近いいなと思ったもの] Hachiojipm #5 LT資料 [テーマ:最近いいなと思ったもの]
Hachiojipm #5 LT資料 [テーマ:最近いいなと思ったもの]
 
PHP基本的関数QUIZ
PHP基本的関数QUIZPHP基本的関数QUIZ
PHP基本的関数QUIZ
 

Andere mochten auch (11)

Sharfu CV.
Sharfu CV.Sharfu CV.
Sharfu CV.
 
1
11
1
 
Profile vps solar pakistan 2016
Profile vps solar pakistan 2016Profile vps solar pakistan 2016
Profile vps solar pakistan 2016
 
LED DOWN LIGHT
LED DOWN LIGHTLED DOWN LIGHT
LED DOWN LIGHT
 
Proposta
PropostaProposta
Proposta
 
4 principles of_spirituality
4 principles of_spirituality4 principles of_spirituality
4 principles of_spirituality
 
Hello adele
Hello adeleHello adele
Hello adele
 
blogs
blogs blogs
blogs
 
Mysql(クライアント)の出力が変わるオプション達
Mysql(クライアント)の出力が変わるオプション達Mysql(クライアント)の出力が変わるオプション達
Mysql(クライアント)の出力が変わるオプション達
 
2016 st 12f
2016 st 12f2016 st 12f
2016 st 12f
 
2016 st 9f
2016 st 9f2016 st 9f
2016 st 9f
 

Mehr von Takaaki Hirano

プログラミング言語のマスコットとか紹介
プログラミング言語のマスコットとか紹介プログラミング言語のマスコットとか紹介
プログラミング言語のマスコットとか紹介
Takaaki Hirano
 
金曜だけどデザインパターンでも勉強しよう
金曜だけどデザインパターンでも勉強しよう金曜だけどデザインパターンでも勉強しよう
金曜だけどデザインパターンでも勉強しよう
Takaaki Hirano
 
非同期データ更新のためにメッセージキューを導入した(い)話
非同期データ更新のためにメッセージキューを導入した(い)話非同期データ更新のためにメッセージキューを導入した(い)話
非同期データ更新のためにメッセージキューを導入した(い)話
Takaaki Hirano
 
月曜だからデザインパターンでも勉強しよう vol.4 Builder
月曜だからデザインパターンでも勉強しよう vol.4 Builder月曜だからデザインパターンでも勉強しよう vol.4 Builder
月曜だからデザインパターンでも勉強しよう vol.4 Builder
Takaaki Hirano
 
月曜だからデザインパターンでも勉強しよう vol.3 Factory Method & Abstract Factory
月曜だからデザインパターンでも勉強しよう vol.3 Factory Method & Abstract Factory月曜だからデザインパターンでも勉強しよう vol.3 Factory Method & Abstract Factory
月曜だからデザインパターンでも勉強しよう vol.3 Factory Method & Abstract Factory
Takaaki Hirano
 
月曜だからデザインパターンでも勉強しよう vol.2 Flyweight
月曜だからデザインパターンでも勉強しよう vol.2 Flyweight月曜だからデザインパターンでも勉強しよう vol.2 Flyweight
月曜だからデザインパターンでも勉強しよう vol.2 Flyweight
Takaaki Hirano
 
月曜だからデザインパターンでも勉強しよう vol.1 それは何 & Singleton
月曜だからデザインパターンでも勉強しよう vol.1 それは何 & Singleton月曜だからデザインパターンでも勉強しよう vol.1 それは何 & Singleton
月曜だからデザインパターンでも勉強しよう vol.1 それは何 & Singleton
Takaaki Hirano
 
書こう!正規表現 vol.4 肯定/否定 先読み/戻り読み
書こう!正規表現 vol.4 肯定/否定 先読み/戻り読み書こう!正規表現 vol.4 肯定/否定 先読み/戻り読み
書こう!正規表現 vol.4 肯定/否定 先読み/戻り読み
Takaaki Hirano
 
書こう!正規表現 vol.2 文字クラス(例外)
書こう!正規表現 vol.2 文字クラス(例外)書こう!正規表現 vol.2 文字クラス(例外)
書こう!正規表現 vol.2 文字クラス(例外)
Takaaki Hirano
 
書こう!正規表現 vol.2 文字クラス(基本)
書こう!正規表現 vol.2 文字クラス(基本)書こう!正規表現 vol.2 文字クラス(基本)
書こう!正規表現 vol.2 文字クラス(基本)
Takaaki Hirano
 
書こう!正規表現 vol.1 正規表現 is 何
書こう!正規表現 vol.1 正規表現 is 何書こう!正規表現 vol.1 正規表現 is 何
書こう!正規表現 vol.1 正規表現 is 何
Takaaki Hirano
 

Mehr von Takaaki Hirano (20)

プログラミング言語のマスコットとか紹介
プログラミング言語のマスコットとか紹介プログラミング言語のマスコットとか紹介
プログラミング言語のマスコットとか紹介
 
金曜だけどデザインパターンでも勉強しよう
金曜だけどデザインパターンでも勉強しよう金曜だけどデザインパターンでも勉強しよう
金曜だけどデザインパターンでも勉強しよう
 
非同期データ更新のためにメッセージキューを導入した(い)話
非同期データ更新のためにメッセージキューを導入した(い)話非同期データ更新のためにメッセージキューを導入した(い)話
非同期データ更新のためにメッセージキューを導入した(い)話
 
月曜だからデザインパターンでも勉強しよう vol.4 Builder
月曜だからデザインパターンでも勉強しよう vol.4 Builder月曜だからデザインパターンでも勉強しよう vol.4 Builder
月曜だからデザインパターンでも勉強しよう vol.4 Builder
 
月曜だからデザインパターンでも勉強しよう vol.3 Factory Method & Abstract Factory
月曜だからデザインパターンでも勉強しよう vol.3 Factory Method & Abstract Factory月曜だからデザインパターンでも勉強しよう vol.3 Factory Method & Abstract Factory
月曜だからデザインパターンでも勉強しよう vol.3 Factory Method & Abstract Factory
 
月曜だからデザインパターンでも勉強しよう vol.2 Flyweight
月曜だからデザインパターンでも勉強しよう vol.2 Flyweight月曜だからデザインパターンでも勉強しよう vol.2 Flyweight
月曜だからデザインパターンでも勉強しよう vol.2 Flyweight
 
月曜だからデザインパターンでも勉強しよう vol.1 それは何 & Singleton
月曜だからデザインパターンでも勉強しよう vol.1 それは何 & Singleton月曜だからデザインパターンでも勉強しよう vol.1 それは何 & Singleton
月曜だからデザインパターンでも勉強しよう vol.1 それは何 & Singleton
 
curl_multi_exec()でFire-and-forgetに失敗した話
curl_multi_exec()でFire-and-forgetに失敗した話curl_multi_exec()でFire-and-forgetに失敗した話
curl_multi_exec()でFire-and-forgetに失敗した話
 
書こう!正規表現 vol.4 肯定/否定 先読み/戻り読み
書こう!正規表現 vol.4 肯定/否定 先読み/戻り読み書こう!正規表現 vol.4 肯定/否定 先読み/戻り読み
書こう!正規表現 vol.4 肯定/否定 先読み/戻り読み
 
PHPUnit 4.0で追加されたwillReturn*()の紹介
PHPUnit 4.0で追加されたwillReturn*()の紹介PHPUnit 4.0で追加されたwillReturn*()の紹介
PHPUnit 4.0で追加されたwillReturn*()の紹介
 
書こう!正規表現 vol.3 ()
書こう!正規表現 vol.3 ()書こう!正規表現 vol.3 ()
書こう!正規表現 vol.3 ()
 
sedで複数行処理 使ってみようNを
sedで複数行処理 使ってみようNをsedで複数行処理 使ってみようNを
sedで複数行処理 使ってみようNを
 
ctagsでvimにひきこもる
ctagsでvimにひきこもるctagsでvimにひきこもる
ctagsでvimにひきこもる
 
書こう!正規表現 vol.2 文字クラス(例外)
書こう!正規表現 vol.2 文字クラス(例外)書こう!正規表現 vol.2 文字クラス(例外)
書こう!正規表現 vol.2 文字クラス(例外)
 
書こう!正規表現 vol.2 文字クラス(基本)
書こう!正規表現 vol.2 文字クラス(基本)書こう!正規表現 vol.2 文字クラス(基本)
書こう!正規表現 vol.2 文字クラス(基本)
 
書こう!ユニットテスト vol.2 どうやって?
書こう!ユニットテスト vol.2 どうやって?書こう!ユニットテスト vol.2 どうやって?
書こう!ユニットテスト vol.2 どうやって?
 
書こう!正規表現 vol.1 正規表現 is 何
書こう!正規表現 vol.1 正規表現 is 何書こう!正規表現 vol.1 正規表現 is 何
書こう!正規表現 vol.1 正規表現 is 何
 
書こう!ユニットテスト vol.1 ナンデ?
書こう!ユニットテスト vol.1 ナンデ?書こう!ユニットテスト vol.1 ナンデ?
書こう!ユニットテスト vol.1 ナンデ?
 
PHP foreachでの参照渡しに潜む罠
PHP foreachでの参照渡しに潜む罠PHP foreachでの参照渡しに潜む罠
PHP foreachでの参照渡しに潜む罠
 
Cocproxy
CocproxyCocproxy
Cocproxy
 

Kürzlich hochgeladen

Kürzlich hochgeladen (10)

論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 

PHP array_uintersectに潜む罠