PHPの質問です。長さが10の配列Aに人の名前が10人分入っています。長さが10の配列Bにも人の名前が10人分入っています。

1)AとBに共通の人名だけ抜きだした配列を作る
2)AとBを合わせた配列を作るが、重複している要素は重複しないように一つだけにする
という操作をしたいのですが、これらを最もスマートに行うにはどんなコードを書けばよいでしょうか?

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2007/06/02 00:20:54
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:jack_sonic No.1

回答回数124ベストアンサー獲得回数25

ポイント100pt

こんにちは。

PHPでは、

共通部分を配列にするarray_intersect()と、

重複要素を削除するarray_unique()という配列操作関数がありますので、

これを使って、

  1. 共通部分を新配列に
  2. 重複を削除

とすると短くかけると思います。

http://jp2.php.net/manual/ja/function.array-unique.php

http://jp2.php.net/manual/ja/function.array-intersect.php


サンプルソース(SHIFT-JIS)

<html><head><meta http-equiv="Content-Type" content="text/html; charset=SHIFT-JIS">
</head>
<body>
<?php
	// テスト配列
	$A = array( '一郎', '二郎', '三郎', '四郎', '五郎', '六郎', '七朗', '七朗' ,'中居', '十兵衛' );
	$B = array( '一郎', '二郎', '三郎', '四郎', '五郎', '六郎', '七朗', '七朗' ,'安藤', '田中' );

/*
1)AとBに共通の人名だけ抜きだした配列を作る
2)AとBを合わせた配列を作るが、重複している要素は重複しないように一つだけにする
*/

	// 共通の人名だけ抜き出した配列を作る
	// ただし、重複している要素は1つにする

	// 共通部分を取り出す
	$res = array_intersect($A, $B);
	// 重複する要素を取り除く
	$res = array_unique($res);
	echo "<pre>";
	var_dump($res);
	echo "</pre>";

?>
</body></html>
id:pha

わ、そんなそのままの関数があったんですね! 

ありがとうございますー

2007/06/02 00:19:47

その他の回答2件)

id:jack_sonic No.1

回答回数124ベストアンサー獲得回数25ここでベストアンサー

ポイント100pt

こんにちは。

PHPでは、

共通部分を配列にするarray_intersect()と、

重複要素を削除するarray_unique()という配列操作関数がありますので、

これを使って、

  1. 共通部分を新配列に
  2. 重複を削除

とすると短くかけると思います。

http://jp2.php.net/manual/ja/function.array-unique.php

http://jp2.php.net/manual/ja/function.array-intersect.php


サンプルソース(SHIFT-JIS)

<html><head><meta http-equiv="Content-Type" content="text/html; charset=SHIFT-JIS">
</head>
<body>
<?php
	// テスト配列
	$A = array( '一郎', '二郎', '三郎', '四郎', '五郎', '六郎', '七朗', '七朗' ,'中居', '十兵衛' );
	$B = array( '一郎', '二郎', '三郎', '四郎', '五郎', '六郎', '七朗', '七朗' ,'安藤', '田中' );

/*
1)AとBに共通の人名だけ抜きだした配列を作る
2)AとBを合わせた配列を作るが、重複している要素は重複しないように一つだけにする
*/

	// 共通の人名だけ抜き出した配列を作る
	// ただし、重複している要素は1つにする

	// 共通部分を取り出す
	$res = array_intersect($A, $B);
	// 重複する要素を取り除く
	$res = array_unique($res);
	echo "<pre>";
	var_dump($res);
	echo "</pre>";

?>
</body></html>
id:pha

わ、そんなそのままの関数があったんですね! 

ありがとうございますー

2007/06/02 00:19:47
id:gae No.2

回答回数14ベストアンサー獲得回数2

ポイント10pt
$a = array('太田','田中','長井','宮地','5番','6番','橋本','山中','秋葉','社長');
$b = array('社長', '山根','田中','青木','吉田','松本','大木','名倉','原田','堀内');

// $a と $b に共通した名前
$c = array_intersect($a, $b);
print_r($c);

// $a と $b を合わせた配列を作って、重複する要素を省く
$d = array_unique(array_merge($a,$b));
print_r($d);

ダミーURL http://jp.php.net/array_unique

id:t_shiono No.3

回答回数256ベストアンサー獲得回数22

ポイント10pt

その後の用途などにも依存するかと思いますが、サイズが10個であれば、以下が一番簡単なのではないでしょうか?

$unique_mergeのキーが問題ならsortでも使ってください。

コードはサイズ5個でやってます。

$a = array("a", "b", "c", "d", "e");

$b = array("a", "c", "e", "f", "g");

$intersect = array_intersect($a, $b);

$unique_merge = array_unique(array_merge($a, $b));

print_r ($intersect);

print_r ($unique_merge);


また、マニュアルを見ると色々あるので、一度目を通しては?

http://jp.php.net/manual/ja/ref.array.php

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません