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

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

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

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

Q&A

1回答

857閲覧

php 日付のキーを振り直す方法

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

1クリップ

投稿2018/11/08 12:11

編集2022/01/12 10:55

前提・実現したいこと

連想配列で日付の新しい順にするためkrsortを使用しています。

キーを日付順にしているところを配列のキーを振り直したいです

発生している問題・エラーメッセージ

文字列に対してキーの振り直しができませんでした。 dateを新しい順にソートをかけた時にキーである 日時が 出ているため [0] (array) ( "id": 7868, "date": "2018-11-08", ), [1] (array) ( "id": 7820, "date": "2018-10-19", ), [2] (array) ( "id": 7722, "date": "2018-10-02", ) になるようにしたい

該当のソースコード

"items": [ { "data_id": 1, "data": { "2018-11-08": { "id": 7868, "date": "2018-11-08", }, "2018-10-19": { "id": 7820, "date": "2018-10-19", }, "2018-10-02": { "id": 7722, "date": "2018-10-02", } } } ] foreach ($i as $key => $data) { $d[$data->id]['id'] = $data->id; $d[$data->id]['data'][$data->date]['data_id'] = $data->data_id; $d[$data->id]['data'][$data->date]['date'] = $data->date; krsort($d[$data->id]['data']); }

###期待したい返却

"items": [ { "data_id": 1, "data": [ { "id": 7868, "date": "2018-11-08", }, { "id": 7820, "date": "2018-10-19", }, { "id": 7722, "date": "2018-10-02", } ] } ]

試したこと

$d[$data->id]['data'] = array_merge($d[$data->id]['data'] )
$d[$data->id]['data'] = array_values($d[$data->id]['data'] )
どちらも文字列に対してキーの振り直しができませんでした。

#ご教授ください。
#よろしくお願いします。

#追記

もしくは
##元データ

"items": [ { "data_id": 1, "data": [ { "id": 7820, "date": "2018-10-19", }, { "id": 7868, "date": "2018-11-08", }, { "id": 7722, "date": "2018-10-02", } ] } ]

##期待データ

"items": [ { "data_id": 1, "data": [ { "id": 7868, "date": "2018-11-08", }, { "id": 7820, "date": "2018-10-19", }, { "id": 7722, "date": "2018-10-02", } ] } ]

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/11/08 12:21

何を条件に、どういう結果を導き出したいのか、手編集したもので構わないので示してほしい。
退会済みユーザー

退会済みユーザー

2018/11/08 12:29

情報を追記いたしました。
退会済みユーザー

退会済みユーザー

2018/11/08 12:51

日付で比較して、降順に並べ直す、という意味でしょうか?
退会済みユーザー

退会済みユーザー

2018/11/08 13:07

はいその通りです。
guest

回答1

0

php

1<?php 2 3$items = [ 4 "data_id" => 1, 5 "data" => [ 6 "2018-11-08" => [ 7 "id" => 7868, 8 "date" => "2018-11-08", 9 ], 10 "2018-10-19" => [ 11 "id" => 7820, 12 "date" => "2018-10-19", 13 ], 14 "2018-10-02" => [ 15 "id" => 7722, 16 "date" => "2018-10-02", 17 ] 18 ] 19]; 20 21print_r($items['data']); 22 23function cmp($a, $b) { 24 if ($a['date'] == $b['date']) { 25 return 0; 26 } 27 return ($a['date'] < $b['date']) ? -1 : 1; 28} 29 30uasort($items['data'], 'cmp'); 31 32print_r($items['data']);

結果
実行結果

ユーザー定義関数を使ったソートがいいんじゃないかと考え、
uasort()を使ってみました。
ソート用関数の特徴については
PHP: 配列のソート - Manual

日付を降順にしたいのであれば、
cmp()関数定義で1と-1を逆にすれば降順になるよ。


日付キーじゃなく連番との指定がありましたので。

php

1<?php 2 3$items = [ 4 "data_id" => 1, 5 "data" => [ 6 "2018-11-08" => [ 7 "id" => 7868, 8 "date" => "2018-11-08", 9 ], 10 "2018-10-19" => [ 11 "id" => 7820, 12 "date" => "2018-10-19", 13 ], 14 "2018-10-02" => [ 15 "id" => 7722, 16 "date" => "2018-10-02", 17 ] 18 ] 19]; 20 21print_r($items['data']); 22 23function cmp($a, $b) { 24 if ($a['date'] == $b['date']) { 25 return 0; 26 } 27 return ($a['date'] < $b['date']) ? 1 : -1; 28} 29 30uasort($items['data'], 'cmp'); 31$items['data'] = array_values($items['data']); 32 33 34print_r($items['data']);

結果
実行結果

投稿2018/11/08 12:27

編集2018/11/08 13:09
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/11/08 12:37

キーである日ずけを1から振り直したいのですが可能でしょうか?
退会済みユーザー

退会済みユーザー

2018/11/08 12:37

回答ありがとうございます。
退会済みユーザー

退会済みユーザー

2018/11/08 12:52 編集

日付を振り直したい、の意味がちょっとわかりかねるので、しっかり質問文中で加筆して説明を加えてください。1から? 何が1?
退会済みユーザー

退会済みユーザー

2018/11/08 13:00

"data": { "2018-11-08": { 2つ目の配列のキーの日付を0、1、2 にしたいです。
退会済みユーザー

退会済みユーザー

2018/11/08 13:00

質問にも追記いたしました。
退会済みユーザー

退会済みユーザー

2018/11/08 13:10

回答内に追記して実現してみました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問