質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

2746閲覧

PHPのループ内の条件分岐で振り分けた項目の並び替え

flat

総合スコア617

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2015/06/01 13:58

編集2015/06/01 14:17

次の様なコードで一致した項目を並び替えて先頭に表示させるにはどうしたら良いでしょうか?
単純に$keyと$itemsの配列をarray_replaceで置き換えようとしてもうまくいかずに頭を悩ませています。

lang

1$key = array_flip( $key ); 2foreach ( $items as $item ) { 3 if ( isset( $key[ $item -> name ] ) ) { 4 echo '<li>Success: ' . $item -> name . '</li>'; 5 } else { 6 echo '<li>Fail: ' . $item -> name . '</li>'; 7 } 8}

現在の表示結果

  • Success: A
  • Fail: B
  • Success: C
  • Fail: D

求める表示結果

  • Success: A
  • Success: C
  • Fail: B
  • Fail: D

$itemsの内容
array(3) {
[0]=>
object(stdClass)#0 (10) {
["name"]=>
string(1) "A"
~省略~
}
[1]=>
object(stdClass)#1 (10) {
["name"]=>
string(1) "B"
~省略~
}
[2]=>
object(stdClass)#2 (10) {
["name"]=>
string(1) "C"
~省略~
}
[3]=>
object(stdClass)#3 (10) {
["name"]=>
string(1) "D"
~省略~
}
}

$keyの内容
array(2) {
[0]=>
string(1) "A"
[1]=>
string(1) "C"
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

$items の並び順そのものを変えたいのであれば、次のように uksort で比較関数を上手く作るとかでもいいかもしれません(それだけの目的にしては大げさかもしれません)。

lang

1<?php 2$key = [ 3 'A', 4 'C', 5]; 6 7$items = [ 8 (object)['name' => 'A'], 9 (object)['name' => 'B'], 10 (object)['name' => 'C'], 11 (object)['name' => 'D'], 12]; 13 14$key = array_flip($key); 15 16uksort($items, function ($a, $b) use ($key, $items) { 17 // `name` プロパティが `$key` にあるものが先 18 $aa = isset($key[$items[$a]->name]); 19 $bb = isset($key[$items[$b]->name]); 20 if ($aa > $bb) { 21 return -1; 22 } elseif ($aa < $bb) { 23 return +1; 24 } 25 // 元の配列のインデックスが最初のものが先 26 if ($a < $b) { 27 return -1; 28 } elseif ($a > $b) { 29 return +1; 30 } 31 return 0; 32}); 33 34foreach ( $items as $item ) { 35 if ( isset( $key[ $item -> name ] ) ) { 36 echo '<li>Success: ' . $item -> name . "</li>\n"; 37 } else { 38 echo '<li>Fail: ' . $item -> name . "</li>\n"; 39 } 40}

投稿2015/06/02 13:10

ngyuki

総合スコア4514

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

flat

2015/06/02 14:21

違うケースまで提示して下さりありがとうございます。 どれが効率が良く適した処理なのかというのは私にはまだ判断出来ないので、今回は見た目に分かりやすい方を選ばせて頂きます。 ただ、頂いたコードに対する私の理解が不足しているのであくまでも素人考えというものですが、ループが1回で済むのは何となくスッキリしていていいですね。 こちらの比較関数の部分も早速勉強しようと思います。:)
guest

0

ベストアンサー

$items 自体を並べ替えたいわけではなく、表示順をどうにかしたいだけであれば、2回 foreach するいのが一番簡単だと思います。

lang

1<?php 2$key = [ 3 'A', 4 'C', 5]; 6 7$items = [ 8 (object)['name' => 'A'], 9 (object)['name' => 'B'], 10 (object)['name' => 'C'], 11 (object)['name' => 'D'], 12]; 13 14$key = array_flip( $key ); 15 16foreach ( $items as $item ) { 17 if ( isset( $key[ $item -> name ] ) ) { 18 echo '<li>Success: ' . $item -> name . "</li>\n"; 19 } 20} 21 22foreach ( $items as $item ) { 23 if ( !isset( $key[ $item -> name ] ) ) { 24 echo '<li>Fail: ' . $item -> name . "</li>\n"; 25 } 26}

投稿2015/06/02 13:02

ngyuki

総合スコア4514

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

flat

2015/06/02 14:13

ngyukiさん 回答して下さりありがとうございます。 分かりやすくてシンプルですね。 何となくループを1回に抑えたい気もしますが、とても分かりやすいのでこちらのコードを使わせて頂こうと思います。
guest

0

こんな感じでしょうか。

lang

1$key = array_flip($key); 2 3// 有効な値を含む配列を生成 4$items_success = array_filter($items, function ($item) use ($key) { 5 return isset($key[$item->name]); 6}); 7// 無効の値を含む配列を生成(有効な値を含む配列との差分で取得) 8$items_fail = array_diff_key($items, $items_success); 9 10// それぞれの配列を表示 11foreach ($items_success as $item) { 12 echo '<li>Success: ' . $item->name . '</li>'; 13} 14foreach ($items_fail as $item) { 15 echo '<li>Fail: ' . $item->name . '</li>'; 16}

投稿2015/06/01 16:19

sounisi5011

総合スコア697

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

flat

2015/06/02 14:02

sounisi5011さん 回答して下さりありがとうございます。 頂いた内容で求める表示が得られました。 また配列の関数やクロージャへの変数の引き継ぎなども頂いたコードを理解するために調べるうちに学ぶ事が出来てとても勉強になりました。:)
guest

0

こちらの回答は間違えて投稿してしまいました…。

投稿2015/06/02 13:29

編集2015/06/02 14:03
flat

総合スコア617

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問