PHPについて次のスクリプトを作成してください。


下記のような地名の配列$ttがあるとします。
$tt = array(
'関東東京都',
'九州博多県',
'関西大阪府',
'関東埼玉県',
'関西京都府',
'中部愛知県'
);


そのうち「関東」と「関西」で始まる要素を配列の後ろにするという
スクリプトを作成してください。
つまり下記のような順番の配列になると言うことです。

$tt = array(
'九州博多県',
'中部愛知県',
'関東東京都',
'関東埼玉県',
'関西大阪府',
'関西京都府'
);

「関東」「関西」以外の「九州博多県」「中部愛知県」が前にきます。
「関東」で始まる要素と「関西」で始まる要素が後ろにきます。

Vista、PHP5.2.6、XAMPP、Firefoxという環境でやってます。
よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2008/12/23 02:08:47
  • 終了:2008/12/23 04:30:59

ベストアンサー

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012008/12/23 03:26:11

ポイント60pt
//
// コールバック関数
function p1($a) { return(preg_match('/^(関東|関西)/',$a)); }
function p2($a) { return(!preg_match('/^(関東|関西)/',$a)); }
//
// 変数
$tt = array(
'関東東京都',
'九州博多県',
'関西大阪府',
'関東埼玉県',
'関西京都府',
'中部愛知県'
);
//
// 処理
$tt = array_merge(array_filter($tt,'p2'), array_filter($tt,'p1'));
//
// 結果出力
print_r($tt);

ループで1つずつ判断しても良いかとは思ったのですが

関東/関西を含むものを抽出するp1と

含まないものを抽出するp2という関数を作っておいて

それぞれを呼び出した結果を結合するという方法を用いてみました。

ところで、博多県って・・・?

id:taroemon

いつもご回答ありがとうございます。


>ループで1つずつ判断しても良いかとは思ったのですが

僕もそういうスクリプトをイメージしてました。

コールバック関数は僕にはまだ難しいかと思ってましたが、

こうやって見てみるとなんとかなりそうな気がしてきました。

勉強になりました。


>ところで、博多県って・・・?

福岡県の間違いです。はずかしいです。

知らなかった訳じゃなかったのですが、勢いで書いてしまいました。

とりあえず、うまくいったので早々に質問を終了します。

2008/12/23 04:30:22
  • id:goodvn
    博多県は突っ込みどころなんだろうか...
  • id:taroemon
    福岡県の間違いです。
    ご指摘ありがとうございます。
  • id:GoldenDawn
    filter と merge の組み合わせはすぐには思いつかないかも。

    ↓あまり行儀のよくないコード。
    usort($tt, create_function('$a', 'return preg_match("/^(関東|関西)/", $a) ;')) ;
  • id:goodvn
    ごめんなさい.指摘というより単なるちゃちゃでした(^^;
    私も解決策を考えてみたのですが良いアイデアが浮かびませんでした.この回答はスマートでよいですね!
  • id:taroemon
    GoldenDawnさん

    コメントありがとうございます。
    他のやり方は初心者の私にはとても勉強になります。
    大変参考になりました。


    goodvnさん

    フォローのコメントありがとうございました。気が休まりました。
    しかし、私がミスしたのには変わりがありません。
    これからは気をつけるようにします。

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

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

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

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