PHPのarrayから再帰的にkeyとvalueを全て取り出す
PHP歴がそろそろ半年になろうとしているので、私的なエチュードであるところの「ある言語で複雑なデータ構造を再帰的に全てスキャンするプログラム」を書いてみた。
動作は表題の通りです。
<?php
# 複雑なデータ構造
$external = ['abc','abcd','abcde','xyz'];
$input = [
'A1' => [
'AA1' => [
'AAA1' => 'aaaa1',
'AAA2' => ['aaaa2','aaaa2a','aaaa2aa','aaaa2aaa']
],
],
'B1' => [
'BB1' => 'bb1',
'BB2' => [
'BBB1' => [
'BBBB1' => 'bbbb1',
'BBBB2' => 'bbbb2',
],
],
'BB3' => 'bb3'
],
'C1' => &$external
];
# 再帰的key_value抽出関数
function extract_key_value_rec($var,&$keys,&$values){
if(!is_scalar($var)){
foreach($var as $key => $value){
if(array_values($var) !== $var){
$keys[$key] = true;
}
extract_key_value_rec($value,$keys,$values);
}
}else{
$values[$var] = true;
}
}
# 実行
extract_key_value_rec($input,$keys_1,$values_1);
print_r($keys_1);
print_r($values_1);
?>
is_scalarでスカラーかどうかの型判定をして再帰呼び出しを続けるかどうかを分岐、array_values($var) !== $var
の部分で連想配列か配列かを判定している。