2chのレスをアンカで並びかえる

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']);


よろしくお願いします。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2013/02/02 11:35:02
  • 終了:2013/02/03 12:04:03

ベストアンサー

id:TransFreeBSD No.2

TransFreeBSD回答回数668ベストアンサー獲得回数2682013/02/02 21:21:18

ポイント300pt

データ構造に不明な点があります。できればデータをあてはめた例を例示してください。
#というかデータ構造がはっきりできないから処理もかけないのだと思った。

データ構造が元の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);
}

というか、そもそものところで謎が。

  • 元々も、PHPで書き換えたというのも2次元配列
  • 「$array_datas[]のキーと 'res_no' => 'レスNo' は合わせてあります。」とあるが
    • レスアンカーは配列?(3番目の方法)
    • そうでなければ同じレスNoに複数のアンカーがあると思うが?(キーと合わせない2番目の方法)
  • 「$array_keys($values)」の意味は?
    • 「array_keys($values)」としても$valuesは配列じゃないし配列のキーの配列もらってもしょうがないし、配列と配列じゃないのを比べてもしょうがない
    • 「$array_keys[$values]」としても同じレスアンカーでも元のレスNoは複数あるはずだが?
他2件のコメントを見る
id:pochi1234

ありがとうございます。希望していた動作になりました。

たしかにfor文の方がわかりやすいかもしれないですが、

array_map()って複雑な感じがするけど、配列の各要素に対して処理するので
便利かなと思います。



レスアンカーの配列とレスNoは、比較できないですが、

array_filterのinputは配列でもOKなので、
レスアンカーの配列の値1つずつに対して比較できていますね。

useを使うのポイント?かなと思います。

2013/02/03 11:43:59
id:pochi1234

array_mapで配列の要素1つずつ処理してるから
res_noを1つずつ処理できているんですね。useは無名関数にスコープ外を変数を使うという宣言ですね。

よく理解できました。

2013/02/03 12:02:59

その他の回答(1件)

id:oil999 No.1

oil999回答回数1728ベストアンサー獲得回数3202013/02/02 11:38:31

ご質問のリンク先のプログラムは、ツリー構造を1次元配列で表現しているので、2次元連想配列で処理することはできません。

【参考】配列

http://php.s3.to/man/language.types.array.html

2分木を使うと並べ替えも簡単にできます。
http://www.phppro.jp/qa/1349?sort=desc

他2件のコメントを見る
id:pochi1234

1次元配列の値となる部分に 配列をネストして入れたいのですが、
上記の方法が間違っているのか無理なのでしょうか?

2013/02/02 12:38:38
id:oil999

配列のネストという意味が分からないのですが、ご質問の方法では2次元配列になります。

2013/02/02 17:32:50
id:TransFreeBSD No.2

TransFreeBSD回答回数668ベストアンサー獲得回数2682013/02/02 21:21:18ここでベストアンサー

ポイント300pt

データ構造に不明な点があります。できればデータをあてはめた例を例示してください。
#というかデータ構造がはっきりできないから処理もかけないのだと思った。

データ構造が元の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);
}

というか、そもそものところで謎が。

  • 元々も、PHPで書き換えたというのも2次元配列
  • 「$array_datas[]のキーと 'res_no' => 'レスNo' は合わせてあります。」とあるが
    • レスアンカーは配列?(3番目の方法)
    • そうでなければ同じレスNoに複数のアンカーがあると思うが?(キーと合わせない2番目の方法)
  • 「$array_keys($values)」の意味は?
    • 「array_keys($values)」としても$valuesは配列じゃないし配列のキーの配列もらってもしょうがないし、配列と配列じゃないのを比べてもしょうがない
    • 「$array_keys[$values]」としても同じレスアンカーでも元のレスNoは複数あるはずだが?
他2件のコメントを見る
id:pochi1234

ありがとうございます。希望していた動作になりました。

たしかにfor文の方がわかりやすいかもしれないですが、

array_map()って複雑な感じがするけど、配列の各要素に対して処理するので
便利かなと思います。



レスアンカーの配列とレスNoは、比較できないですが、

array_filterのinputは配列でもOKなので、
レスアンカーの配列の値1つずつに対して比較できていますね。

useを使うのポイント?かなと思います。

2013/02/03 11:43:59
id:pochi1234

array_mapで配列の要素1つずつ処理してるから
res_noを1つずつ処理できているんですね。useは無名関数にスコープ外を変数を使うという宣言ですね。

よく理解できました。

2013/02/03 12:02:59
  • id:pochi1234
    PHPで2chのレスを並び替える。そのうちの未来へのアンカー削除方法。

    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] => レス文
    )

    )



この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません