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

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

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

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

Q&A

解決済

2回答

4416閲覧

array_filter を多次元連想配列に使う

cookiemonster

総合スコア2

PHP

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

0グッド

0クリップ

投稿2020/09/07 01:11

編集2020/09/07 01:14

###実現したいこと
SHOW COLUMNS FROM {$table}したカラムとして、以下$col_wrapperがあります。

ここから「Nullが許容されているカラム名」を配列で取得したいです。

php

1// 実現したい取得結果 2$result = ["service_id","kind_id"];

###該当のソースコード
テーブルの「カラム情報」です。

php

1$col_wrapper = array ( 2 0 => 3 array ( 4 'Field' => 'ID', 5 'Type' => 'bigint(20) unsigned', 6 'Null' => 'NO', 7 'Key' => 'PRI', 8 'Default' => NULL, 9 'Extra' => 'auto_increment', 10 ), 11 1 => 12 array ( 13 'Field' => 'service_id', 14 'Type' => 'tinyint(3) unsigned', 15 'Null' => 'YES', 16 'Key' => '', 17 'Default' => NULL, 18 'Extra' => '', 19 ), 20 2 => 21 array ( 22 'Field' => 'kind_id', 23 'Type' => 'tinyint(3) unsigned', 24 'Null' => 'YES', 25 'Key' => '', 26 'Default' => NULL, 27 'Extra' => '', 28 ) 29); 30

###発生している問題
「カラム名」でなく「カラム情報」がすべて取得されてしまいます。

###試したこと
基本的にarray_filterを使っての実現を求めています。
しかし以下で問題が発生します。

php

11 $result = array_filter($col_wrapper, function($col_info) { 22 33 if( $col_info['Null'] === 'YES' ) { return $col_info['Field']; } 44 }); 55 var_dump($result);

できない理由がわからず、以下のようにひとまずダンプしましたが、余計わからなくなりました。

php

11 $result = array_filter($col_wrapper, function($col_info) { 22 var_dump($col_info); // ひとまずダンプ 33 if( $col_info['Null'] === 'YES' ) { return $col_info['Field']; } 44 }); 55 //var_dump($result);

2行目のダンプの結果は次の通りで、これがダンプされるならば、3行目の$col_info['Field']はダンプの['Field']と一致するはずです。
それなのにどうして、上記$resultは「カラム名」でなく「カラム情報」がすべて取得されることになるのでしょうか?

returnしているのは「カラム情報」でなく$col_info['Field']の「カラム名」のはずと思うのですが。

PHP

1array(6) { 2 ["Field"]=> 3 string(2) "ID" 4 ["Type"]=> 5 string(19) "bigint(20) unsigned" 6 ["Null"]=> 7 string(2) "NO" 8 ["Key"]=> 9 string(3) "PRI" 10 ["Default"]=> 11 NULL 12 ["Extra"]=> 13 string(14) "auto_increment" 14} 15array(6) { 16 ["Field"]=> 17 string(10) "service_id" 18 ["Type"]=> 19 string(19) "tinyint(3) unsigned" 20 ["Null"]=> 21 string(3) "YES" 22 ["Key"]=> 23 string(0) "" 24 ["Default"]=> 25 NULL 26 ["Extra"]=> 27 string(0) "" 28} 29array(6) { 30 ["Field"]=> 31 string(7) "kind_id" 32 ["Type"]=> 33 string(19) "tinyint(3) unsigned" 34 ["Null"]=> 35 string(3) "YES" 36 ["Key"]=> 37 string(0) "" 38 ["Default"]=> 39 NULL 40 ["Extra"]=> 41 string(0) "" 42} 43

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

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

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

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

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

m.ts10806

2020/09/07 01:14

コード提示の際は行数は省略してもらえると動作確認の手間が減るので助かります。
guest

回答2

0

PHP

1$result=array_map(function($x){ 2 return $x['Field']; 3},array_filter($col_wrapper,function($x){ 4 return $x['Null']=='YES'; 5}));

投稿2020/09/07 01:21

yambejp

総合スコア114843

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

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

cookiemonster

2020/09/07 01:31

ありがとうございます。phper.k様と1分違いでした。
guest

0

ベストアンサー

php

1<?php 2 3$col_wrapper = array( 4 0 => 5 array( 6 'Field' => 'ID', 7 'Type' => 'bigint(20) unsigned', 8 'Null' => 'NO', 9 'Key' => 'PRI', 10 'Default' => NULL, 11 'Extra' => 'auto_increment', 12 ), 13 1 => 14 array( 15 'Field' => 'service_id', 16 'Type' => 'tinyint(3) unsigned', 17 'Null' => 'YES', 18 'Key' => '', 19 'Default' => NULL, 20 'Extra' => '', 21 ), 22 2 => 23 array( 24 'Field' => 'kind_id', 25 'Type' => 'tinyint(3) unsigned', 26 'Null' => 'YES', 27 'Key' => '', 28 'Default' => NULL, 29 'Extra' => '', 30 ) 31); 32 33$res = array_map(function ($col) { 34 return $col['Field']; 35}, array_filter($col_wrapper, function ($col) { 36 return $col['Null'] == 'YES'; 37})); 38var_dump($res);

投稿2020/09/07 01:20

phper.k

総合スコア3923

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

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

cookiemonster

2020/09/07 01:26

ありがとうございます。array_mapが必要でしたか。さらにarray_valuesもかけたくなりますと、素直にループの方がわかりやすくて良いでしょうか?
phper.k

2020/09/07 01:29

両方書いてわかりやすい方法を選択してください。
cookiemonster

2020/09/07 01:32

そうします。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問