→http://d.hatena.ne.jp/Gemma/20091021/1256138200
を見てPHPで書き換えてますが、わからないことがあって困ってます。
下記の方法は参考URLを元に、1次元配列のキーをレスNoとして、値をレスアンカーとして、
未来へのアンカーを含まない配列を生成しています。
removeFutureAnchor($array_data);
function removeFutureAnchor($array_data) {
return array_map(
function ($input) {
return array_filter($input, function($values) {
return $values < $array_keys($values);
}
);
}
, $array_data);
}
上記の方法を、下記のような形式の2次元の連想配列で行なうことを考えています。
1次元配列と2次元の連想配列でやり方が違うのかわからなくて質問させて頂きました。
何か良い方法はないでしょうか?
$array_datas[] = array(
'res_no' => 'レスNo',
'name' => '名前',
'res_anchor' => 'レスアンカー',
'res' => 'レス文'
); // $array_datas[]のキーと 'res_no' => 'レスNo' は合わせてあります。
removeFutureAnchor($array_datas['res_anchor']);
よろしくお願いします。
データ構造に不明な点があります。できればデータをあてはめた例を例示してください。
#というかデータ構造がはっきりできないから処理もかけないのだと思った。
データ構造が元の2次元配列の個々のレスアンカーの値が連想配列になった3次元配列(レス配列×レスアンカー配列×レスアンカーデータ連想配列)の場合
名前とレス文の持たせ方変えればまあ妥当?
<?php function removeFutureAnchor($array_data) { return array_map(function ($input) { return array_filter($input, function($values) { return $values['res_anchor'] < $values['res_no']; }); }, $array_data); }
データ構造がそれぞれのレスアンカーのデータを連想配列に収めたレスアンカーデータ連想配列の配列(レスアンカー配列)できている2次元配列(レスアンカー配列×レスアンカーデータ連想配列)の場合
場合によってはこれでも。DB的。でも名前とレス文が。
<?php function removeFutureAnchor($array_data) { return array_filter($array_data, function($values) { return $values['res_anchor'] < $values['res_no']; }); }
データ構造が元のレスアンカー配列を収めたレス配列の代わりに、レスアンカー配列を持つレスデータ連想配列の配列(レス配列)という3次元配列(レス配列×レスデータ連想配列×レスアンカー配列)の場合
クロージャが必要?というかこうする意味ある?
<?php function removeFutureAnchor($array_data) { return array_map(function ($input) { $res_no = $input['res_no']; return array_filter($input['res_anchor'], function($values) use($res_no) { return $values < $res_no; }); }, $array_data); }
というか、そもそものところで謎が。
ご質問のリンク先のプログラムは、ツリー構造を1次元配列で表現しているので、2次元連想配列で処理することはできません。
http://php.s3.to/man/language.types.array.html
2分木を使うと並べ替えも簡単にできます。
http://www.phppro.jp/qa/1349?sort=desc
TransFreeBSDさんのコード。
<?php
$array_data = [
['res_no' => 1, 'res_anchor' => [], 'res' => 'レス文'],
['res_no' => 2, 'res_anchor' => [1], 'res' => 'レス文'],
['res_no' => 3, 'res_anchor' => [1, 2], 'res' => 'レス文'],
['res_no' => 4, 'res_anchor' => [2, 5, 6], 'res' => 'レス文'],
['res_no' => 5, 'res_anchor' => [1], 'res' => 'レス文']
];
function removeFutureAnchor($array_data) {
return array_map(function ($input) {
$res_no = $input['res_no'];
$input['res_anchor'] = array_filter($input['res_anchor'], function($values) use($res_no) {
return $values < $res_no;
});
return $input;
}, $array_data);
}
print_r(removeFutureAnchor($array_data));
?>
↓結果
Array
(
[0] => Array
(
[res_no] => 1
[res_anchor] => Array
(
)
[res] => レス文
)
[1] => Array
(
[res_no] => 2
[res_anchor] => Array
(
[0] => 1
)
[res] => レス文
)
[2] => Array
(
[res_no] => 3
[res_anchor] => Array
(
[0] => 1
[1] => 2
)
[res] => レス文
)
[3] => Array
(
[res_no] => 4
[res_anchor] => Array
(
[0] => 2
)
[res] => レス文
)
[4] => Array
(
[res_no] => 5
[res_anchor] => Array
(
[0] => 1
)
[res] => レス文
)
)