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

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

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

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

Q&A

解決済

4回答

909閲覧

php 配列のソートについて

amaguri

総合スコア227

PHP

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

0グッド

0クリップ

投稿2017/04/19 06:12

編集2017/04/19 07:15
$arr2 = array( array('no' => 1, 'name' => 'コナン'), array('no' => 4, 'name' => '光彦'), array('no' => 2, 'name' => '元太'), array('no' => 3, 'name' => '歩美'), array('no' => 5, 'name' => '哀'), );

というデータがあった場合

no=3を基準にソートをかけることは可能でしょうか? no=3 no=4 no=5 no=1 no=2 や no=3 no=1 no=2 no=4 no=5

このような形でソートが可能な場合どのように実装すれば
実現できるのか教えていただきたいです。

追記
no=>3
no=>1
no=>2
no=>4
no=>5

のような実装が望ましいです。

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

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

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

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

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

kei344

2017/04/19 06:21

配列の書き方が少しわかりにくいので、実際にPHPで使用できる形に書き換えていただけませんか?
guest

回答4

0

ベストアンサー

php

1$arr2 = array( 2 array('no' => 1, 'name' => 'コナン'), 3 array('no' => 4, 'name' => '光彦'), 4 array('no' => 2, 'name' => '元太'), 5 array('no' => 3, 'name' => '歩美'), 6 array('no' => 5, 'name' => '哀'), 7); 8 9usort($arr2, function($a, $b) { 10 11 if ($a['no'] == $b['no']) { 12 return 0; 13 } 14 15 if ($a['no'] == 3) { 16 return -1; 17 } 18 if ($b['no'] == 3) { 19 return 1; 20 } 21 22 return $a['no'] - $b['no']; 23}); 24 25print_r($arr2);

実行結果

Array ( [0] => Array ( [no] => 3 [name] => 歩美 ) [1] => Array ( [no] => 1 [name] => コナン ) [2] => Array ( [no] => 2 [name] => 元太 ) [3] => Array ( [no] => 4 [name] => 光彦 ) [4] => Array ( [no] => 5 [name] => 哀 ) )

投稿2017/04/19 07:44

KiyoshiMotoki

総合スコア4791

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

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

0

まず、配列の形はキチンと書きましょう。以下2つのどちらなのか、判然としません。

php

1$arr1 = array( 2 1 => 'コナン', 3 4 => '光彦', 4 2 => '元太', 5 3 => '歩美', 6 5 => '哀' 7); 8 9$arr2 = array( 10 array('no' => 1, 'name' => 'コナン'), 11 array('no' => 4, 'name' => '光彦'), 12 array('no' => 2, 'name' => '元太'), 13 array('no' => 3, 'name' => '歩美'), 14 array('no' => 5, 'name' => '哀'), 15);

そして、「no=3を基準にソートをかける」とありますが、3以外の順序はどうするのでしょうか。そのあたりの仕様を決めてもらわないと、どうしようもありません。

投稿2017/04/19 06:24

編集2017/04/19 06:33
maisumakun

総合スコア145184

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

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

0

たとえばこんな感じでしょうか?

PHP

1$a = [ 2 ['no' => 1, 'name' => 'コナン'], 3 ['no' => 4, 'name' => '光彦'], 4 ['no' => 2, 'name' => '元太'], 5 ['no' => 3, 'name' => '歩美'], 6 ['no' => 5, 'name' => '哀'], 7]; 8print "3を先頭にしてあとは順列<br>"; 9$b=$a; 10usort($b,function($x,$y){ 11 return $x["no"]==3?-1:($x["no"]>$y["no"]?1:-1); 12}); 13print_r($b); 14print "<br>"; 15print "3から後ろを順列、その後1から順列<br>"; 16$c=$a; 17usort($c,function($x,$y){ 18 if($x["no"]>=3 && $x["no"]>$y["no"]) return -1; 19 if($x["no"]<3 && $x["no"]<$y["no"]) return 1; 20 return $x["no"]>$y["no"]?1:-1; 21}); 22print_r($c); 23

※ちょっと後者あやしいかも

投稿2017/04/19 07:38

yambejp

総合スコア114843

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

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

0

no の順でソートする。ただし最初を 3 として、それより前にあるものについては末尾へ移動させる、ということをしたいのでしょうか?

だとすると、ソートに使う値としては、

  • no から 3 を引く
  • ただし上の結果が負数になるときは、結果に PHP_INT_MAX を加算して扱う

(いわゆる「ゲタをはかせる」)
とやればできそうではありますが……


質問修正に伴い変更

通常の配列の sort() 系ではうまくいかないですね。
Ds::Map クラスで sort() の compare function を適切に書ければなんとかなるかも。試していませんが。

PHP

1function comparator($a, $b) { 2 if ($a == 3) { 3 return PHP_INT_MIN; 4 } else if ($b == 3) { 5 return PHP_INT_MAX; 6 } else { 7 return ($a-$b); 8 } 9}

投稿2017/04/19 06:42

編集2017/04/19 07:38
tacsheaven

総合スコア13703

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問