Submit Search
PHP array_uintersectに潜む罠
0 likes
454 views
Takaaki Hirano
array_uintersect tutorial
Technology
Read more
1 of 31
Download now
Download to read offline
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
More Related Content
PDF
20170401 alias
sela-parlack
PDF
みんなで Swift 復習会 GO! in 岩手 – 9th′
Tomohiro Kumagai
PPTX
詳説ぺちぺち
do_aki
ODP
本当は怖いPHP
Takuya Sato
PDF
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
Tomohiro Kumagai
PDF
アルゴリズム+データ構造勉強会(8)
noldor
KEY
Elixir macro-in-action-1
k1complete
ODP
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
勝成 鈴江
20170401 alias
sela-parlack
みんなで Swift 復習会 GO! in 岩手 – 9th′
Tomohiro Kumagai
詳説ぺちぺち
do_aki
本当は怖いPHP
Takuya Sato
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
Tomohiro Kumagai
アルゴリズム+データ構造勉強会(8)
noldor
Elixir macro-in-action-1
k1complete
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
勝成 鈴江
What's hot
(20)
PDF
俺のフックがこんなに簡単なわけがない。
Hishikawa Takuro
PDF
Elixirだ 第2回
Joe_noh
PDF
C++11概要 ライブラリ編
egtra
PDF
Elixirだ 第1回 - 基礎だ -
Joe_noh
PDF
Swift らしい表現を目指そう #eventdots
Tomohiro Kumagai
PPTX
PHPのタイプヒンティング
Hidetaka Okamoto
PDF
Elixirだ 第1回強化版 後半
Joe_noh
PDF
Elixirだ 第1回強化版 前半
Joe_noh
PDF
Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
Tomohiro Kumagai
ODP
Ekmett勉強会発表資料
時響 逢坂
PDF
Swift 3.0 の新機能 - 追加・変更まわりだけ、ざっくり紹介 2 #devsap
Tomohiro Kumagai
PDF
"What Does Your Code Smell Like?"で学ぶPerl6
risou
PDF
Ekmett勉強会発表資料
時響 逢坂
KEY
モナドがいっぱい!
Kenta Sato
PDF
Ruby 同好会宣言
Yuya Takeyama
PPTX
F#のすすめ
Hiromu Sasaki
PDF
40分濃縮 PHP classの教室
Yusuke Ando
PDF
すごいH 第12章モノイド
Shinta Hatatani
PDF
Hachiojipm #5 LT資料 [テーマ:最近いいなと思ったもの]
norry_gogo
PPTX
PHP基本的関数QUIZ
Wataru Terada
俺のフックがこんなに簡単なわけがない。
Hishikawa Takuro
Elixirだ 第2回
Joe_noh
C++11概要 ライブラリ編
egtra
Elixirだ 第1回 - 基礎だ -
Joe_noh
Swift らしい表現を目指そう #eventdots
Tomohiro Kumagai
PHPのタイプヒンティング
Hidetaka Okamoto
Elixirだ 第1回強化版 後半
Joe_noh
Elixirだ 第1回強化版 前半
Joe_noh
Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
Tomohiro Kumagai
Ekmett勉強会発表資料
時響 逢坂
Swift 3.0 の新機能 - 追加・変更まわりだけ、ざっくり紹介 2 #devsap
Tomohiro Kumagai
"What Does Your Code Smell Like?"で学ぶPerl6
risou
Ekmett勉強会発表資料
時響 逢坂
モナドがいっぱい!
Kenta Sato
Ruby 同好会宣言
Yuya Takeyama
F#のすすめ
Hiromu Sasaki
40分濃縮 PHP classの教室
Yusuke Ando
すごいH 第12章モノイド
Shinta Hatatani
Hachiojipm #5 LT資料 [テーマ:最近いいなと思ったもの]
norry_gogo
PHP基本的関数QUIZ
Wataru Terada
Ad
Viewers also liked
(11)
DOC
Sharfu CV.
sharafudheenkommakmd Sharafudheen
PDF
1
BIPLAB SEN, M. Eng, P. Eng.
PDF
Profile vps solar pakistan 2016
Abid Hussain
DOCX
LED DOWN LIGHT
Maxpromotion
PPT
Proposta
Pino Verri
PPT
4 principles of_spirituality
jajisarma
PDF
Hello adele
Noelia Contreras
ODP
blogs
edicarua
ODP
Mysql(クライアント)の出力が変わるオプション達
Takaaki Hirano
PPTX
2016 st 12f
Chang lianlian
PPTX
2016 st 9f
Chang lianlian
Sharfu CV.
sharafudheenkommakmd Sharafudheen
1
BIPLAB SEN, M. Eng, P. Eng.
Profile vps solar pakistan 2016
Abid Hussain
LED DOWN LIGHT
Maxpromotion
Proposta
Pino Verri
4 principles of_spirituality
jajisarma
Hello adele
Noelia Contreras
blogs
edicarua
Mysql(クライアント)の出力が変わるオプション達
Takaaki Hirano
2016 st 12f
Chang lianlian
2016 st 9f
Chang lianlian
Ad
More from Takaaki Hirano
(20)
ODP
プログラミング言語のマスコットとか紹介
Takaaki Hirano
ODP
金曜だけどデザインパターンでも勉強しよう
Takaaki Hirano
ODP
非同期データ更新のためにメッセージキューを導入した(い)話
Takaaki Hirano
ODP
月曜だからデザインパターンでも勉強しよう vol.4 Builder
Takaaki Hirano
ODP
月曜だからデザインパターンでも勉強しよう vol.3 Factory Method & Abstract Factory
Takaaki Hirano
ODP
月曜だからデザインパターンでも勉強しよう vol.2 Flyweight
Takaaki Hirano
ODP
月曜だからデザインパターンでも勉強しよう vol.1 それは何 & Singleton
Takaaki Hirano
ODP
curl_multi_exec()でFire-and-forgetに失敗した話
Takaaki Hirano
ODP
書こう!正規表現 vol.4 肯定/否定 先読み/戻り読み
Takaaki Hirano
ODP
PHPUnit 4.0で追加されたwillReturn*()の紹介
Takaaki Hirano
ODP
書こう!正規表現 vol.3 ()
Takaaki Hirano
ODP
sedで複数行処理 使ってみようNを
Takaaki Hirano
ODP
ctagsでvimにひきこもる
Takaaki Hirano
ODP
書こう!正規表現 vol.2 文字クラス(例外)
Takaaki Hirano
ODP
書こう!正規表現 vol.2 文字クラス(基本)
Takaaki Hirano
ODP
書こう!ユニットテスト vol.2 どうやって?
Takaaki Hirano
ODP
書こう!正規表現 vol.1 正規表現 is 何
Takaaki Hirano
ODP
書こう!ユニットテスト vol.1 ナンデ?
Takaaki Hirano
ODP
PHP foreachでの参照渡しに潜む罠
Takaaki Hirano
ODP
Cocproxy
Takaaki Hirano
プログラミング言語のマスコットとか紹介
Takaaki Hirano
金曜だけどデザインパターンでも勉強しよう
Takaaki Hirano
非同期データ更新のためにメッセージキューを導入した(い)話
Takaaki Hirano
月曜だからデザインパターンでも勉強しよう vol.4 Builder
Takaaki Hirano
月曜だからデザインパターンでも勉強しよう vol.3 Factory Method & Abstract Factory
Takaaki Hirano
月曜だからデザインパターンでも勉強しよう vol.2 Flyweight
Takaaki Hirano
月曜だからデザインパターンでも勉強しよう vol.1 それは何 & Singleton
Takaaki Hirano
curl_multi_exec()でFire-and-forgetに失敗した話
Takaaki Hirano
書こう!正規表現 vol.4 肯定/否定 先読み/戻り読み
Takaaki Hirano
PHPUnit 4.0で追加されたwillReturn*()の紹介
Takaaki Hirano
書こう!正規表現 vol.3 ()
Takaaki Hirano
sedで複数行処理 使ってみようNを
Takaaki Hirano
ctagsでvimにひきこもる
Takaaki Hirano
書こう!正規表現 vol.2 文字クラス(例外)
Takaaki Hirano
書こう!正規表現 vol.2 文字クラス(基本)
Takaaki Hirano
書こう!ユニットテスト vol.2 どうやって?
Takaaki Hirano
書こう!正規表現 vol.1 正規表現 is 何
Takaaki Hirano
書こう!ユニットテスト vol.1 ナンデ?
Takaaki Hirano
PHP foreachでの参照渡しに潜む罠
Takaaki Hirano
Cocproxy
Takaaki Hirano
PHP array_uintersectに潜む罠
1.
PHP array_uintersectに潜む罠
2.
array_intersect
3.
配列の共通項を計算する
4.
配列の共通項を計算する $arr1 = ['foo',
'bar', 'baz']; $arr2 = ['foo', 'baz']; array_intersect($arr1, $arr2); // ['foo', 'baz']
5.
注意 二つの要素は、 (string) $elem1 ===
(string) $elem2 の場合のみ 等しいとみなされます。 言い換えると、文字列表現が同じ場合となります。
6.
多次元配列の比較ができない
7.
そこでarray_uintersect
8.
配列の共通項を計算する(コールバック)
9.
配列の共通項を計算する(コールバック) $arr1 = [ ['key'
=> 'foo'], ['key' => 'bar'], ['key' => 'baz'], ]; $arr2 = [ ['key' => 'foo'], ['key' => 'baz'], ]; array_uintersect($arr1, $arr2, $someFunc); // [['key' => 'foo'], ['key' =>'baz']]
10.
比較関数について 比較関数は、 最初の引数と二番目の引数の比較結果を返します。 最初の引数のほうが二番目の引数より大きい場合は正の数を、 二番目の引数と等しい場合はゼロを、 そして二番目の引数より小さい場合は負の数を返す 必要があります。
11.
???
12.
比較?比較ナンデ?
13.
0のとき等しい、俺は詳しいんんだ $someFunc = function($a,
$b) { if ($a['key'] === $b['key']) { return 0; } }; array_uintersect($arr1, $arr2, $someFunc);
14.
グワーッ!! $someFunc = function($a,
$b) { if ($a['key'] === $b['key']) { return 0; } }; array_uintersect($arr1, $arr2, $someFunc); // [ // ['key' => 'foo'], // ['key' => 'bar'], // ['key' => 'baz'], // ]
15.
罠1: 関数はきちんと書くべし
16.
せいかいのかきかた $someFunc = function($a,
$b) { if ($a['key'] === $b['key']) { return 0; } if ($a['key'] > $b['key']) { return 1; } return -1; };
17.
結構応用できるのでは?
18.
部分一致を試してみる $someFunc = function($a,
$b) { if (strpos($a, $b) !== false) { return 0; } if ($a > $b) { return 1; } return -1; };
19.
部分一致を試してみる $arr1 = ['foo',
'bar', 'bazfoo', 'fooqux']; $arr2 = ['foo']; array_uintersect($arr1, $arr2, $someFunc);
20.
グワーッ!! $arr1 = ['foo',
'bar', 'bazfoo', 'fooqux']; $arr2 = ['foo']; array_uintersect($arr1, $arr2, $someFunc); // [ // 'bazfoo', // ]
21.
罠2: 内部では 入力をソートしている
22.
かつごうったってそうはいかねえ $someFunc = function($a,
$b) { echo "{$a} <=> {$b}" . PHP_EOL; if ($a == $b) { return 0; } if ($a > $b) { return 1; } return -1; };
23.
かつごうったってそうはいかねえ $arr1 = [1,
3, 5]; $arr2 = [2, 4]; array_uintersect($arr1, $arr2, $someFunc);
24.
グワーッ!! 3 <=> 1 5
<=> 3 4 <=> 2 1 <=> 2 3 <=> 2 3 <=> 2 3 <=> 4 5 <=> 4 5 <=> 4
25.
グワーッ!! 3 <=> 1 5
<=> 3 4 <=> 2 // 明らかに入力をソートしている 1 <=> 2 3 <=> 2 3 <=> 2 3 <=> 4 5 <=> 4 5 <=> 4
26.
……どうしてこんなことするの 多分計算量節約のため。
27.
……どうしてこんなことするの 多分計算量節約のため。 入力をソートする初期コストはかかるが、 ソート済み配列を辿るならば 自分より小さいまたは一致する要素の次に 自分より大きい要素が来た場合、 それ以上辿っても自分と一致する要素はないことがわかる。
28.
……どうしてこんなことするの 多分計算量節約のため。 入力をソートする初期コストはかかるが、 ソート済み配列を辿るならば 自分より小さいまたは一致する要素の次に 自分より大きい要素が来た場合、 それ以上辿っても自分と一致する要素はないことがわかる。 これにより全要素対全要素の比較をしなくてよくなり、 特に要素が多い場合の計算量が抑えられる。
29.
……どうしてこんなことするの 多分計算量節約のため。 入力をソートする初期コストはかかるが、 ソート済み配列を辿るならば 自分より小さいまたは一致する要素の次に 自分より大きい要素が来た場合、 それ以上辿っても自分と一致する要素はないことがわかる。 これにより全要素対全要素の比較をしなくてよくなり、 特に要素が多い場合の計算量が抑えられる。 比較関数が完全でないといけない理由は、 最初のソートに使うため。
30.
つまりは こんなことには使えない: 一致の有無がソート順では判断できない場合。 ex. 文字列の部分一致 こんなことには使える: 一致の有無がソート順で判断できる場合。 ex. 文字列の前方一致
31.
罠を知って楽しい array_uintersectライフを!
Download