PHPで以下のような配列があります。

TEST1_ARRAY:
array
'TEST1-AAA' => '★A1'
'TEST1-BBB' => '★A2'
'TEST1-CCC' => 'A3'

TEST2_ARRAY:
array
'TEST2-AAA' => '★A4'
'TEST2-BBB' => 'A5'

でこのTEST1_ARRAYとTEST2_ARRAYをPHPのarray_mergeで一緒にすると
以下のようになります。

array
'TEST1-AAA' => '★A1'
'TEST1-BBB' => '★A2'
'TEST1-CCC' => 'A3'
'TEST2-AAA' => '★A4'
'TEST2-BBB' => 'A5'

で、これをですね、以下のようにするにはどうしたらいいでしょうか?
'TEST1-AAA' => '★A1'
'TEST1-BBB' => '★A2'
'TEST2-AAA' => '★A4'
'TEST1-CCC' => 'A3'
'TEST2-BBB' => 'A5'

最終的には、foreachでまわしながら、値に★があれば TEST3_ARRAYに入れて
それ以外はTEST4_ARRAYに入れて、再度、array_mergeすれば
いいんじゃないかなーと思うのですが、なんか、いい感じの関数みたいの
ご存知でしたら、教えて下さい。

以上、よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/10/26 18:05:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:horonict No.1

回答回数257ベストアンサー獲得回数51

ポイント35pt

uasort関数を使ってみました。

http://jp2.php.net/manual/ja/function.uasort.php

ただし、スクリプトの文字コードは UTF-8 限定です。

<?php
mb_internal_encoding('UTF-8');
mb_regex_encoding('UTF-8');

//質問通りの並べ替えを実現する
function ore_sort($a, $b) {
    $pat = '/(★)?([^★]*)/ui';
    preg_match($pat, $a, $ra);
    preg_match($pat, $b, $rb);
    if ($ra[1] == $rb[1])   $res = strcmp($ra[2], $rb[2]);
    else                    $res = strcmp($b, $a);
    return $res;
}

$arr = array(
'TEST1-AAA' => '★A1',
'TEST1-BBB' => '★A2',
'TEST1-CCC' => 'A3',
'TEST2-AAA' => '★A4',
'TEST2-BBB' => 'A5',
);

var_dump($arr);
uasort($arr, "ore_sort");
var_dump($arr);
?>
id:hopefully

ありがとうございます。

ですが、自分が悪いのですが、こちらの環境は、EUC-JPになります。

なので、EUC-JPの場合はどうしたらいいのでしょうか?

2009/10/19 19:34:11
id:GoldenDawn No.2

回答回数426ベストアンサー獲得回数81

ポイント35pt

別のやり方で。

<?php
$arr = array(
  'TEST1-AAA' => '★A1',
  'TEST1-BBB' => '★A2',
  'TEST1-CCC' => 'A3',
  'TEST2-AAA' => '★A4',
  'TEST2-BBB' => 'A5',
  );

$result = array_filter($arr, create_function('$a', 'return strpos($a, "A") > 0;'))
+ array_filter($arr, create_function('$a', 'return strpos($a, "A") == 0;')) ;

print_r($result) ;
?>
  • id:tezcello
    > 自分が悪いのですが、こちらの環境は、EUC-JPになります。
    たまたまサーバが EUC-JP だからといって、PHP のスクリプトが UTF-8 で記述出来ない訳ではないですよ。
    エンコードの変換をするのに何も支障はありませんし。

    例示のような単純な場合は、前もって★を半角ブランクに置き換えておいて(str_replace等)ソート後再度置き換えるでもいいのでは?
    実装時は★ではないとか不特定長の文字列とかでしょうから、コメントで。
  • id:horonict
    > こちらの環境は、EUC-JPになります

    ★とアルファベットだけなら、冒頭部分を下記のようにすることで動くでしょう。

    --------------
    mb_internal_encoding('EUC-JP');
    mb_regex_encoding('EUC-JP');

    //質問通りの並べ替えを実現する
    function ore_sort($a, $b) {
    $pat = '/(★)?([^★]*)/i';
    --------------以下略

    ただ、preg_match を使っている関係上、EUC-JPでは、任意の全角文字で並べ替えができるかどうかは保証できません。

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

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

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

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