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

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

ただいまの
回答率

88.93%

PHP 配列 特定の値 追加

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 408

Z-TALBO

score 493

やりたいこと

複数行のデータを取り扱うとき、最大行数(今回は10行)に達していない場合、最大行数になるようにする処理

テストデータ

$TestDate = [];
$TestDate[] = ['20140425230', 'A', '09:00'];
$TestDate[] = ['20140425231', 'B', '10:00'];
$TestDate[] = ['20140425233', 'C', '12:00'];
$TestDate[] = ['20140425235', 'D', '14:00'];

今回のテストで最終的にしたいデータ

$TestDate[] = ['20140425230', 'A', '09:00'];
$TestDate[] = ['20140425231', 'B', '10:00'];
$TestDate[] = ['20140425232', '', ''];
$TestDate[] = ['20140425233', 'C', '12:00'];
$TestDate[] = ['20140425234', '', ''];
$TestDate[] = ['20140425235', 'D', '14:00'];
$TestDate[] = ['20140425236', '', ''];
$TestDate[] = ['20140425237', '', ''];
$TestDate[] = ['20140425238', '', ''];
$TestDate[] = ['20140425239', '', ''];

一応やってはみたこと

考えが足りないのですが、、、、
1.最大が10行なら、現在の行数を数えて残りを追加
これだと結局2014042523[0~9]のどれなのかわからない
※重複はNGです。

2.for文で回してみる?

// 変わらない共通部分
$dateNum = '2014042523';

// 最大10行ならfor文で回してみたらどうなんだろうか?
for($i = 0; $i < 10; $i++) {
    // 2014~~の部分が[0~9]あるのかどうか
    $id = in_array($Ymd.$car.$i, $TestDate[$i]);
    // 無い場合は$dateNum.$iで[2014042523[0~9]]を作ってみる
    if(!$id) {
        $TestDate[] = [$dateNum.$i, '', ''];
    } else {

    }
}

やってみたことの②の結果

array(12) {
  [0]=>
  array(3) {
    [0]=>
    string(11) "20140425230"
    [1]=>
    string(1) "A"
    [2]=>
    string(5) "09:00"
  }
  [1]=>
  array(3) {
    [0]=>
    string(11) "20140425231"
    [1]=>
    string(1) "B"
    [2]=>
    string(5) "10:00"
  }
  [2]=>
  array(3) {
    [0]=>
    string(11) "20140425233"
    [1]=>
    string(1) "C"
    [2]=>
    string(5) "12:00"
  }
  [3]=>
  array(3) {
    [0]=>
    string(11) "20140425235"
    [1]=>
    string(1) "D"
    [2]=>
    string(5) "14:00"
  }
  [4]=>
  array(3) {
    [0]=>
    string(11) "20140425232"
    [1]=>
    string(0) ""
    [2]=>
    string(0) ""
  }
  [5]=>
  array(3) {
    [0]=>
    string(11) "20140425233"
    [1]=>
    string(0) ""
    [2]=>
    string(0) ""
  }
  [6]=>
  array(3) {
    [0]=>
    string(11) "20140425234"
    [1]=>
    string(0) ""
    [2]=>
    string(0) ""
  }
  [7]=>
  array(3) {
    [0]=>
    string(11) "20140425235"
    [1]=>
    string(0) ""
    [2]=>
    string(0) ""
  }
  [8]=>
  array(3) {
    [0]=>
    string(11) "20140425236"
    [1]=>
    string(0) ""
    [2]=>
    string(0) ""
  }
  [9]=>
  array(3) {
    [0]=>
    string(11) "20140425237"
    [1]=>
    string(0) ""
    [2]=>
    string(0) ""
  }
  [10]=>
  array(3) {
    [0]=>
    string(11) "20140425238"
    [1]=>
    string(0) ""
    [2]=>
    string(0) ""
  }
  [11]=>
  array(3) {
    [0]=>
    string(11) "20140425239"
    [1]=>
    string(0) ""
    [2]=>
    string(0) ""
  }
}

問題点

無い頭でやってあと一歩なのかな、、、とか思うところまではやったのですが、、、
当然の話今回のケースだと、20140425233と20140425235の部分は重複してしまいました。
理由的な部分はそもそもテストデータを上から確認しているときに、20140425232が存在していない時点でそこから下がfalseになっているからとは思っているんですが、、、

ここから、又はそもそもの考え方が違うのかとは思いますが、どのような形にすると良いでしょうか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

ロジックとしては良いと思います。
配列から値が探し切れていないのだと思います。
in_arrayのところを修正してみました。

// 最大10行ならfor文で回してみたらどうなんだろうか?
for($i = 0; $i < 10; $i++) {
    // 2014~~の部分が[0~9]あるのかどうか
    $key = array_search($dateNum.$i, array_column($TestDate, 0));
    // 無い場合は$dateNum.$iで[2014042523[0~9]]を作ってみる
    if($key === FALSE) {
        $TestDate[] = [$dateNum.$i, '', ''];
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/25 10:59

    回答ありがとうございます!

    思ったようにデータができました。
    配列から値が探しきれてないのは思っていましたが、どうも、そこを解決する術に辿り着けませんでしたが、一つ勉強になりました!!

    キャンセル

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

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る