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

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

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

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

Q&A

解決済

2回答

1000閲覧

PHPの配列内容が動的に変わった時にも対応できる処理がうまくいかない

tomato01

総合スコア82

PHP

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

0グッド

1クリップ

投稿2024/05/13 03:51

実現したいこと

下記の配列に対して「true」というものだけを抽出し処理を行い、「希望する結果」にしたいと考えております。

$table = [ [10, 'Alpha', true], [13, 'Beta', false], [15, 'Gamma', true], [21, 'Delta', true], ];

希望する結果

$result = [ [10, 15, 21], ['Alpha', 'Gamma', 'Delta'], ];

その際に、各配列の値が増えた場合でも取得ができるように処理をしたいです。(=数が動的に変動する)

例 [10, 'Alpha', true, 'pen'],

発生している問題・分からないこと

◾️試した内容

in_arrayでtrueがある配列を抽出した後に、各値を格納する変数名を「動的に対応できそうな名前」で作成しました。

そして、3つの変数のボックスに各値が入ってくれることを希望していたのですが、配列が9こ作成されてしまいました。

◾️教えてほしいこと

1、動的に作られる変数名が3つだけになり各値を入れるにはどのように変更をすればいいでしょうか(おそらくループの記載位置などが間違っていると思いますが、どこに置いたら良いかまだわかりません、)

2、上記1の問題が解決された後に、trueが入る配列は除外して出力をさせるにはどうしたらいいでしょいか。

3、そもそも他のやり方でスムーズに実現ができる方法はありますでしょうか。

該当のソースコード

php

1◾️実際のコード 2```ここに言語を入力 3<?php 4 5$table = [ 6 [10, 'Alpha', true], 7 [13, 'Beta', false], 8 [15, 'Gamma', true], 9 [21, 'Delta', true], 10]; 11$count = 0; 12 13foreach ($table as $row) { 14 15 if(in_array(true,$row, true)) { 16 17 for ($i = 0 ; $i < count($row) ; $i++){ 18 $count = $count + $i; 19 ${"box_".$i}[] = $row[$i]; 20 // $val2 = ${"box_".$i}; 21 var_dump(${"box_".$i}); 22 } 23 } 24}
### 試したこと・調べたこと - [x] teratailやGoogle等で検索した - [x] ソースコードを自分なりに変更した - [ ] 知人に聞いた - [ ] その他 ##### 上記の詳細・結果 ◾️出力結果 ```ここに言語を入力 array ( 0 => 10, )array ( 0 => 'Alpha', )array ( 0 => true, )array ( 0 => 10, 1 => 15, )array ( 0 => 'Alpha', 1 => 'Gamma', )array ( 0 => true, 1 => true, )array ( 0 => 10, 1 => 15, 2 => 21, )array ( 0 => 'Alpha', 1 => 'Gamma', 2 => 'Delta', )array ( 0 => true, 1 => true, 2 => true,

補足

特になし

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

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

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

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

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

Eggpan

2024/05/13 04:03

bool型の値が入るのは各配列の3つめで固定ですか? 3つめ固定ではない場合、何番目が判定用の要素化を確定するための要件が必要になります。
yambejp

2024/05/13 04:24

> 各配列の値が増えた場合でも取得ができるように処理をしたい 増えたときにどうしたいのでしょうか?
tomato01

2024/05/13 04:36

ご連絡を頂きありがとうございます。 >bool型の値が入るのは各配列の3つめで固定ですか? >3つめ固定ではない場合、何番目が判定用の要素化を確定するための要件が必要になります。 こちら固定ではございません。 例えば、各値が3つなら取得をしたい箇所は7,8,9番目の変数、各値が4つなら取得をしたい箇所は9,10,11,12番目の変数になると思います。 >増えたときにどうしたいのでしょうか? すみません、各配列の項目に応じて、下記のように新たな配列を作成できればと考えております。 ◾️ベースのデータ $table = [ [10, 'Alpha', true, 'pen'], [13, 'Beta', false , 'pen2'], [15, 'Gamma', true, 'pen3'], [21, 'Delta', true, 'pen4'], ]; ◾️希望の結果 $result = [ [10, 15, 21], ['Alpha', 'Gamma', 'Delta'], ['pen', 'pen3', 'pen4'], ];
yambejp

2024/05/13 04:37

回答しておきましたので動作確認してみてください
tomato01

2024/05/13 05:13

ちなみに私のコードの方法でやる場合は、どこを調整すれば意図した結果が出そうでしょうか。 教えてもらえますと大変助かります。
guest

回答2

0

ベストアンサー

命題が中途半端なので適当に解釈して

PHP

1<?PHP 2$table = [ 3 [10, 'Alpha', true,'a1','a2'], 4 [13, 'Beta', false,'b1','b2'], 5 [15, 'Gamma', true,'c1','c2'], 6 [21, 'Delta', true,'d1','d2'], 7]; 8$result=[]; 9$num=2; 10for($i=0;$i<count($table);$i++){ 11 if($table[$i][$num]){ 12 if(count($result)==0){ 13 for($j=0;$j<count($table[$i]);$j++){ 14 if($j!=$num) $tmp[]=&$result[]; 15 } 16 } 17 for($j=0;$j<count($tmp);$j++){ 18 $tmp[$j][]=$table[$i][$j<$num?$j:($j+1)]; 19 } 20 } 21} 22unset($tmp); 23print_r($result);

改良版

PHP

1<?PHP 2$table = [ 3 [10, 'Alpha', true,'a1','a2'], 4 [13, 'Beta', false,'b1','b2'], 5 [15, 'Gamma', true,'c1','c2'], 6 [21, 'Delta', true,'d1','d2'], 7]; 8foreach ($table as $row) { 9 if(in_array(true,$row, true)) { 10 $result[]=array_filter($row,function($x){return $x!==true;}); 11 } 12} 13$result=call_user_func_array( "array_map", array_merge([null],$result)); 14print_r($result);

今風に

PHP

1<?PHP 2$table = [ 3 [10, 'Alpha', true,'a1','a2'], 4 [13, 'Beta', false,'b1','b2'], 5 [15, 'Gamma', true,'c1','c2'], 6 [21, 'Delta', true,'d1','d2'], 7]; 8foreach ($table as $row) { 9 if(in_array(true,$row, true)) { 10 $result[]=array_filter($row,fn($x)=>$x!==true); 11 } 12} 13$result=call_user_func("array_map",null,...$result); 14print_r($result);

投稿2024/05/13 04:33

編集2024/05/14 00:56
yambejp

総合スコア115878

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

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

tomato01

2024/05/13 04:52

ご回答誠にありがとうございます! すみません、下記はどういう処理なのか、少しだけ伺っても大丈夫しょうか。 ① $num=2; ② if($table[$i][$num]){ } ①について、下記のような配列の値の数が追加され、こちらで追加された数がわからない時でも処理ができそうでしょうか。 例 [10, 'Alpha', true, 'pen'],
tomato01

2024/05/13 04:53

わかりました! trueの箇所の指定ですね。 どうもありがとうございました!
yambejp

2024/05/13 05:13

お察しのとおりで、可変なデータということなので汎用性のため検索列が変わることを想定してあります。
tomato01

2024/05/13 05:14

ありがとうございます! ちなみに私のコードの方法でやる場合は、どこを調整すれば意図した結果が出そうでしょうか。 教えてもらえますと大変助かります。
yambejp

2024/05/13 05:20 編集

trueを含むかどうかでジャッジしたいということですかね? 逆にtrue/falseのデータは1行に1列しかないという保証があるということでよいでしょうか?
tomato01

2024/05/13 05:23

ご連絡ありがとうございます。 はい、true/falseは1行に1列しかないということでお願いします。
yambejp

2024/05/13 05:58 編集

改良版挙げておきました。 一応tomato01さんのソースも最大限活かしてあります
tomato01

2024/05/13 05:52

誠にありがとうございます! ちゃんと理解できるように勉強を致します。 どうもありがとうございました。
yambejp

2024/05/13 06:10

今風にコールバック関数とスプレッド構文で書き換えておきました 環境が許せばご利用ください
tomato01

2024/05/13 06:15

かりこまりました! どうもありがとうございます。
guest

0

出遅れてしまいましたが、僕ならこんな感じ。

PHP

1$result = array_reduce($table, function ($carry, $item){ 2 if (array_splice($item, 2, 1)[0]) { 3 foreach ($item as $k=>$v) { 4 $carry[$k][] = $v; 5 } 6 } 7 return $carry; 8}); 9var_dump($result);

動的に作られる変数名が3つだけになり各値を入れる

「3つ」の意味が良く解りませんが、

trueが入る配列は除外

する為に、フラグ位置の値とそれ以外とを分離してから作業しています。
分離後の値(フラグ部を除いた配列)は、それぞれの順番通りに出力変数に入れていけば良いので、入力される値が正規化された値であるなら、foreach()で回せば数を気にする必要もないです。
__データベースから取得する様な値であるなら、先頭をフラグにしておけば
__array_shift()が使えたので、もっと理解し易かったと思う...

投稿2024/05/13 05:18

編集2024/05/13 06:02
tezcello

総合スコア301

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

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

tomato01

2024/05/13 05:53

ご回答、誠にありがとうございます! そういったやり方もあるのですね。とても勉強になります! どうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.40%

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

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

質問する

関連した質問