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

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

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

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

3回答

704閲覧

連想配列内の要素をある条件の時先頭に持って行く方法がわからない

Tatsuo_Iriyama

総合スコア50

PHP

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2018/11/09 02:40

編集2018/11/09 03:24

##現状

PHP 7.2
CakePHP 3.x系
で開発を行なっています。

ある連想配列を、ある条件の時だけ先頭に持っていきたいと考えています。

現状の連想配列の中身はこちらです。

[ (int) 0 => object(App\Model\Entity\Hoge) { 'id' => (int) 1, 'title' => 'aaaaaaa', }, (int) 1 => object(App\Model\Entity\Hoge) { 'id' => (int) 2, 'title' => 'bbbbbbbbb', }, (int) 2 => object(App\Model\Entity\Hoge) { 'id' => (int) 3, 'title' => 'ccccccccc', }, (int) 3 => object(App\Model\Entity\Hoge) { 'id' => (int) 4, 'title' => 'ddddddddd', } ]

こちらの連想配列のidと

下記の連想配列のkeyが一致する時、上記の連想配列の要素を先頭に持ってきたいです。

[ (int) 3 => (int) 0, (int) 1 => (int) 0, (int) 2 => (int) 11, (int) 4 => (int) 12 ]

なんとなく書いたコードがこちらになります。

php

1//一番目の配列を$aとします。 2//二番目の配列は$bとします。 3 4foreach ($a as $hoge) { 5 foreach ($b as $key => $value) { 6 if ($hoge->id == $key) { 7 // 一致した要素を先頭に持ってくる 8 } 9 } 10}

期待する値はこちらです。

[ (int) 0 => object(App\Model\Entity\Hoge) { 'id' => (int) 3, 'title' => 'ccccccccc', }, (int) 1 => object(App\Model\Entity\Hoge) { 'id' => (int) 1, 'title' => 'aaaaaaa', }, (int) 2 => object(App\Model\Entity\Hoge) { 'id' => (int) 2, 'title' => 'bbbbbbbbb', }, (int) 3 => object(App\Model\Entity\Hoge) { 'id' => (int) 4, 'title' => 'ddddddddd', } ]

##質問事項

  • 期待とする結果となるコードを教えて頂きたいです。

足りない点ありましたら、修正依頼等でコメント下さい。
よろしくお願い致します。

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

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

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

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

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

guest

回答3

0

ベストアンサー

PHP

1class Hoge { 2 public $id; 3 public $title; 4 5 public function Hoge($id, $title) { 6 $this->id = $id; 7 $this->title = $title; 8 } 9} 10 11 12$objects = [new Hoge(1, 'aaa'), new Hoge(2, 'bbb'), new Hoge(3, 'ccc'), new Hoge(4, 'ddd'), new Hoge(5, 'eee')]; 13 14$order = [ 15 3 => 0, 16 1 => 0, 17 2 => 11, 18 4 => 12 19]; 20// 並び順のまま、キーだけ取り出し 21$order_keys = array_keys($order); 22// オーダー指定されている配列のサイズを取得 23$order_size = count($order); 24 25$ordered = []; 26$nonOrder = []; 27foreach($objects as $obj ) { 28 // オーダー指定のあるObjectの場合、オーダー順を取得 29 $index = array_search($obj->id, $order_keys); 30 if($index !== FALSE) { 31 // オーダー指定順にObjectを配置 32 $ordered[$index] = $obj; 33 } else { 34 // 指定がないものは、オーダー指定のあるモノ以降に追加 35 $nonOrder[$order_size + count($nonOrder)] = $obj; 36 } 37} 38$sorted = $ordered + $nonOrder; 39 40ksort($sorted); 41print_r($sorted);

投稿2018/11/09 04:38

kunai

総合スコア5405

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

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

Tatsuo_Iriyama

2018/11/09 05:25

ご回答ありがとうございます。一部抜粋した形で、ご回答頂いたコードを使ったところ、上手くいきました。 ありがとうございました!
guest

0

こんなんでいいのでは?
下記は$bの順に$aを$a2に詰めなおします。
(動作未確認)

PHP

1//一番目の配列を$aとします。 2//二番目の配列は$bとします。 3$a2 = array(); 4foreach($b as $key => $value){ 5 $a2[$key] = $a[$key]; 6} 7

投稿2018/11/09 05:09

ttyp03

総合スコア16998

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

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

Tatsuo_Iriyama

2018/11/09 05:25

ご回答ありがとうございます。 ご提案頂いた方法ですと、$aはEntityでobjectなので、indexでのアクセスが出来ませんでした。
ttyp03

2018/11/09 05:35

失礼しました。 $aの構造を読みきれてませんでした。
guest

0

どのDBMSをつかってるかわからんので業務で使ってるDBの一つの書き方

sql

1SELECT ID 2 FROM TEST 3 ORDER BY IF( ID = 3 , 0, 1), ID

とすると事で 対象の IDが一番上となりそれ以外がIDの昇順になる設定になります。

QueryBuilderでがんばれば出来るはずです。

投稿2018/11/09 03:44

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Tatsuo_Iriyama

2018/11/09 05:26

ご回答ありがとうございます。 参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問