PHPの関数で

配列A
Array
(
[0] => TEST1/039
[1] => TEST2/222
)
配列B
Array
(
[0] => TEST1/039
[1] => TEST4/111
)
を関数でマージした際に
配列Cの結果にするには何かいい
関数はありますか?
配列C
Array
(
[0] => TEST1/039
[1] => TEST2/222
[2] => TEST4/111
)

array_mergeだと下に追加になるだけで
さらにPHP5にした際にちょっと処理が
変わるので、他に方法ありますか?
PHP4です。

回答の条件
  • 1人5回まで
  • 登録:2007/06/11 16:51:05
  • 終了:2007/06/12 11:42:25

回答(2件)

id:t_shiono No.1

t_shiono回答回数256ベストアンサー獲得回数222007/06/11 17:00:01

ポイント35pt

PHP4とPHP5での挙動の差ですが、今回の場合は無関係なのでしょうか?その辺りの気になる点をもう少し教えて貰えますか?

array_mergeでよれれば次のような感じがコード上は楽です。

$a = array("TEST1/039", "TEST2/222");
$b = array("TEST1/039", "TEST4/111");

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

出力順は何が期待する順序か分かりませんが、必要があれば、sortでも利用してください。

id:hopefully

PHP5だと

$a = array("TEST1/039","TEST2/111");

$b = array("TEST4/111""TEST1/039");

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

とやったら、

array("TEST1/039","TEST2/111");

こんな結果になりますか?

なりませんよね?

2007/06/11 17:23:04
id:tezcello No.2

tezcello回答回数457ベストアンサー獲得回数682007/06/11 17:37:10

ポイント35pt

array_unique() が使えます。(php4, php5 共に使える関数です)


ローカルでチェックしてみました

$array_A = array('TEST1/039', 'TEST2/222');
$array_B = array('TEST1/039', 'TEST4/111');

// 配列を結合
$array_C = array_merge($array_A, $array_B);

// 重複要素を削除(同時にソートされる)
$array_C = array_unique($array_C);

var_dump($array_C);

結果は、

array(3) {

[0]=>

string(9) "TEST1/039"

[1]=>

string(9) "TEST2/222"

[3]=>

string(9) "TEST4/111"

}

と表示されます。

id:hopefully

ありがとうございますw

2007/06/12 11:40:10
  • id:tezcello
    ごめんなさい、自動でソートはされません。
    $array_C = array_merge($array_A, $array_B);
    sort($array_C);
    $array_C = array_unique($array_C);
    としてソートしておいた方がいいでしょう。
  • id:tezcello
    > こんな結果になりますか?
    > なりませんよね?
    ソートが出来ていれば、問題ありません。

    $array_A = array('TEST1/039', 'TEST2/222');
    $array_B = array('TEST4/111', 'TEST1/039', 'TEST5/023');

    $array_C = array_merge($array_A, $array_B);
    sort($array_C);
    $array_C = array_unique($array_C);

    で結果は、
    array(4) {
    [0]=>
    string(9) "TEST1/039"
    [2]=>
    string(9) "TEST2/222"
    [3]=>
    string(9) "TEST4/111"
    [4]=>
    string(9) "TEST5/023"
    }
    でした。
    当方の環境は、Apache2.2.3 php5.2.1 です。
  • id:t_shiono
    手元の環境では、以下のようになりますが、何が問題なのでしょうか?

    >|
    > php --version
    PHP 5.0.4 (cli) (built: Jul 4 2006 11:46:38)
    Copyright (c) 1997-2004 The PHP Group
    Zend Engine v2.0.4-dev, Copyright (c) 1998-2004 Zend Technologies
    > cat test.php
    <?php
    $a = array("TEST1/039", "TEST2/111");
    $b = array("TEST4/111", "TEST1/039");
    $t = array_merge($a, $b);
    print_r($t);
    $c = array_unique($t);
    print_r($c);
    ?>
    > php test.php
    Array
    (
    [0] => TEST1/039
    [1] => TEST2/111
    [2] => TEST4/111
    [3] => TEST1/039
    )
    Array
    (
    [0] => TEST1/039
    [1] => TEST2/111
    [2] => TEST4/111
    )
    |<

    また、PHPのマニュアルを参照すると、次のようになっています。

    http://jp.php.net/array_mergeより抜粋
    >|
    array_merge() の動作は PHP 5 で変更されました。PHP 4 とは異なり、 array_merge() は、array 型のパラメータのみを受け取るようになりました。しかし、 他の型をマージするために型キャストを使用することも可能です。 詳細は以下の例を参照してください。
    |<

    入力パラメタがarrayでない場合は影響がPHPのバージョンによってはないかと思うのですが・・・。
  • id:tezcello
    当方の環境(さっきのと少々違っていて Apache1.3.33, php4.4.4)で再度確認しました。
    元の配列が、
    $array_A = array("TEST1/039", "TEST2/111");
    $array_B = array("TEST4/111", "TEST1/039");
    の場合も、同じ結果(正しい結果)が得られました。
    ただし、
    $array_A = array('TEST2/222', 'TEST1/039');
    $array_B = array('TEST1/039', 'TEST4/111');
    の場合は、
    array(3) {
    [0]=>
    string(9) "TEST2/222"
    [1]=>
    string(9) "TEST1/039"
    [3]=>
    string(9) "TEST4/111"
    }
    となりました。
    配列のソートが済んでいない場合は、
    マージ後ソートしないと順序が狂う
    マージ後ソートしてもキーが不連続となる
    場合があるようですね。
    (ソートは単純な昇順・降順の場合を想定してます。特殊な場合は検証出来ない為)

    ソート済みの元配列をマージして、重複除去の手順が基本の様ですね。
  • id:hopefully
    みなさんありがとうございます。
    今回のには特に問題がないようなのでこのまま
    行きますw

    ありがとうございました。

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません