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

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

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

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

Q&A

解決済

3回答

2417閲覧

連想配列を任意の配列順番に並び替えしたい

paranoaman1217

総合スコア24

PHP

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

0グッド

3クリップ

投稿2017/09/20 17:29

###前提・実現したいこと
どうしても分からないのでご存知の方いらっしゃいましたら教えて下さい。
phpを使用して連想配列を任意で指定した配列順番に並べ替えを行いたいと考えています。
こちらの連想配列の['id']を。。

php

1array{ 2 [0]=>array{ 3 ['id']=>31 4 ['name']=>test1 5 } 6 [1]=>array{ 7 ['id']=>29 8 ['name']=>test2 9 } 10 [2]=>array{ 11 ['id']=>22 12 ['name']=>test3 13 } 14 [3]=>array{ 15 ['id']=>23 16 ['name']=>test4 17 } 18 [4]=>array{ 19 ['id']=>24 20 ['name']=>test5 21 } 22}

以下で定義した配列の順番に並び替えたいです。

php

1array{ 2[0]=>29 3[0]=>31 4[0]=>24 5[0]=>23 6[0]=>22 7}

以下が望む形の並び替えを行った連想配列の結果です。

php

1array{ 2 [0]=>array{ 3 ['id']=>29 4 ['name']=>test2 5 } 6 [1]=>array{ 7 ['id']=>31 8 ['name']=>test1 9 } 10 [2]=>array{ 11 ['id']=>24 12 ['name']=>test5 13 } 14 [3]=>array{ 15 ['id']=>23 16 ['name']=>test4 17 } 18 [4]=>array{ 19 ['id']=>22 20 ['name']=>test3 21 } 22}

値などを維持した状態で並び替えを行いたいのですが方法分かる方いらっしゃいますでしょうか?ご存知でしたらご教授のほどよろしくお願いいたします。

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

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

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

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

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

kei344

2017/09/20 17:35

ご自身で試されたコードを質問文に追記し、「何」が「どのように」わからないのか、コードのどの部分で詰まっているのかなどを具体的に追記されたほうが回答が望めると思います。
guest

回答3

0

こんな感じでどうしょうか?
リストにない値をどうするとか、idがダブっていた時どうするとか
一切無視していますので必要に応じて機能を追加して下さい

PHP

1$a=[ 2 ['id'=>31,'name'=>"test1"], 3 ['id'=>29,'name'=>"test2"], 4 ['id'=>22,'name'=>"test3"], 5 ['id'=>23,'name'=>"test4"], 6 ['id'=>24,'name'=>"test5"], 7]; 8$b=[29,31,24,23,22]; 9usort($a,function($x,$y) use ($b){ 10 return array_search($x["id"],$b)>array_search($y["id"],$b); 11}); 12print_r($a);

投稿2017/09/21 00:38

yambejp

総合スコア114572

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

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

paranoaman1217

2017/09/22 12:58

ご回答いただきありがとうございます! 僕のような者からするとかなりモダンな書き方ですね。 こんな書き方も出来るんですね、凄い。。 大変勉強になりました!
guest

0

ベストアンサー

※注)並び順を定義する配列($order)に定義されていidのデータは消失します

php

1$array1 = [ 2 ['id'=>31,'name'=>"test1"], 3 ['id'=>29,'name'=>"test2"], 4 ['id'=>22,'name'=>"test3"], 5 ['id'=>23,'name'=>"test4"], 6 ['id'=>24,'name'=>"test5"], 7]; 8$order = [29,31,24,23,22]; 9 10$sorted_array = []; 11 12foreach ($order as $search_id) { 13 foreach ($array1 as $idx => $record) { 14 if ($search_id == $record['id']) { 15 $sorted_array[] = $record; 16 unset($array1[$idx]); 17 break; 18 } 19 } 20} 21 22$array1 = $sorted_array; 23 24var_dump($array1);

投稿2017/09/21 04:30

編集2017/09/21 04:37
rkojima

総合スコア421

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

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

paranoaman1217

2017/09/22 12:59

ご回答いただきありがとうございます! 僕個人foreachをよく使うため非常に直感的で分かりやすかったです! 勉強になりました、ありがとうございます!!
guest

0

質問に記載頂いた内容はPHPの配列定義とは異なるようです。
記載の状況について、選択ソートで実装すると下記のようになります。

PHP

1<?php 2 3// 配列定義 4$haystack = array( 5 array('id' => 31, 'name' => 'test1'), 6 array('id' => 29, 'name' => 'test2'), 7 array('id' => 22, 'name' => 'test3'), 8 array('id' => 23, 'name' => 'test4'), 9 array('id' => 24, 'name' => 'test5'), 10); 11 12// 並び替え順序 13$order = array(29, 31, 24, 23, 22); 14 15for ($i = 0; $i < count($haystack); $i++) { 16 // $i番目のid 17 $needle = $order[$i]; 18 for ($j = $i; $j < count($haystack); $j++) { 19 // idの値が$i番目になる値と同じかチェック 20 if ($haystack[$j]['id'] == $needle) { 21 // 並び替え位置が同じであればスキップ 22 if ($i != $j) { 23 $tmp = $haystack[$i]; 24 $haystack[$i] = $haystack[$j]; 25 $haystack[$j] = $tmp; 26 } 27 continue; 28 } 29 } 30} 31 32// 結果を出力 33print_r($haystack);

投稿2017/09/21 00:15

編集2017/09/21 00:24
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

paranoaman1217

2017/09/22 12:57

ご回答いただきありがとうございます! やはりネストにするんですね、大変勉強になります! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問