お題:リストの内容比較
ここの問題を解いた
http://npnl.hatenablog.jp/entry/20101023/1287835025
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
<?php /* 二つのリスト(左・右)の内容を比較し、片方にしかないものと両方に在るものを出力するプログラムを書いて下さい。 条件 ・リストの入力方法、出力方法は自由とします。 ・入力されるリストの内容は未ソートかつ重複がある可能性を考慮して下さい。 ・出力されるリストは、左のリストにのみある内容、右のリストにのみある内容、両方のリストにある内容の三種類とします。 ・出力されるリストは辞書順ソートかつ重複は除去した形式として下さい。 サンプル入力リスト: [listL] aaa bbb ccc bbb eee hhhh [listR] bbb ddd eee fff ggg iiiii サンプル出力リスト: [left only] aaa ccc hhhh [right only] ddd fff ggg iiiii [both] bbb eee また、余裕のある方は以下のように左右の内容を並べて出力して下さい。 サンプル出力リスト(余裕のある方用): aaa | bbb | bbb ccc | | ddd | eee | fff | ggg hhhh | | iiiii */ $listL = [ "aaa", "bbb", "ccc", "bbb", "eee", "hhhh" ]; $listR = [ "bbb", "ddd", "eee", "fff", "ggg", "iiii" ]; output($listL, $listR); function output($listL, $listR){ $leftOnly = getFirstOnly($listL, $listR); $rightOnly = getFirstOnly($listR, $listL); $both = getBoth($listL, $listR); printLine($leftOnly, "left only"); printLine($rightOnly, "right only"); printLine($both, "both"); } function printLine($a, $title="notitle"){ echo "[" . $title . "] "; for($i=0; $i<count($a); $i++){ $v = $a[$i]; echo $v; if($i<count($a)-1){ echo " "; }else{ echo PHP_EOL; } } } function getFirstOnly($f, $s){ $o = []; foreach($f as $v){ if(false === in_array($v, $s)){ $o[] = $v; } } return $o; } function getBoth($f, $s){ $b = []; foreach($f as $v){ if(in_array($v, $s)){ if(false === in_array($v, $b)){ $b[] = $v; } } } return $b; } |