1

私は次のPHP配列を持っています:

$data = Array 
(   
    [rules1.txt] => Array 
    ( 
        [rules] => Array 
        ( 
            [0] => throw rule blah
            [1] => punt rule blah
            [2] => #comment 
            [3] =>
            [4] => #punt rule that is commented out
        ) 
        [item] => rules1 
        [itemId] => 4 
        [new] => true 
    ) 

    [rules2.txt] => Array
    (
        ...
    )

    ...
)

私が関わっている配列の一部は、$data['rules']とそのキーと値です。配列のこの部分にはさまざまな数のキーがあり、もちろん値もさまざまです。

私がやろうとしているのは、「throw」や「punt」などの特定のキーワードで始まる値を「検索」することです...空白行($ data ['rules'] [3]など)とコメント付きの値($ data ['rules'][2]や...[4]など)を削除する必要があります。

したがって、どのループを使用しても、次のような構造になる必要があります...

$data = Array 
(   
    [rules1.txt] => Array 
    ( 
        [rules] => Array 
        ( 
            [0] => throw rule blah
            [1] => punt rule blah
        ) 
        [item] => rules1 
        [itemId] => 4 
        [new] => true 
    ) 

    [rules2.txt] => Array
    (
        ...
    )

    ...
)

目標を達成するために、キーワードを保持する単純な追加の配列を作成しました...

$actions = Array(
    'throw',
    'punt'
);

...ループで使用して、次のような3番目の配列を作成します...

$removeThese = Array 
(   
    [rules1.txt] => Array 
    ( 
        [0] => 2
        [1] => 3
        [2] => 4
    ) 

    [rules2.txt] => Array
    (
        ...
    )

    ...
)

上記の配列$removeThisは、各ファイル(rules1.txt、rules2.txtなど)の$data['rules']から削除する必要がある$data['rules']インデックスを保持しているだけです。

私はPHPに耳を傾けているので、試した各アプローチで失敗しました。正しいデータがunset()されていないか、$ removeThisを作成しているときに、誤って配列を上書きしています。

ポイントA(削除するアイテムを含む元の$ data)からポイントB(アイテムを削除する更新された$ date)に到達するための最適な提案を探しています。

どうもありがとう。

編集

近いように見えますが$removeThisが上書きされている次のコードを試しました...$dataの最後のファイルと$data['rules']の最後のインデックスのみで終了します。

foreach ($data as $fileName => $fileData)
{
    foreach ($fileData as $fdKey => $fdValue)
    {
        if ($fdKey === 'rules')
        {
            foreach ($fdValue as $key => $value)
            {
                foreach ($actions as $action)
                {
                    if (strpos($value, $action) != 0)
                    {
                        if (!in_array($value, $removeThese[$fileName]))
                        {
                            $removeThese[$fileName][] = $key;
                        }
                    }
                }
            }
        }
    }
}

したがって、2つの問題があります。

1)$ removeThisを上書きする原因となったのはどこで間違っていますか?
2)これを書くためのより良い方法は何ですか?

修理済み

私が探していた最終的なコードは、それほど悪くはないと思いますが、学ぶことはたくさんあります...

foreach ($data as $fileName => $fileData)
{
    foreach ($fileData as $fdKey => $fdValue)
    {
        if ($fdKey === 'rules')
        {
            foreach ($fdValue as $key => $value)
            {
                $value = rtrim($value, "\n");

                if (!in_array($value, $actions) === true)
                {
                    unset($data[$fileName][$fdKey][$key]);
                }
            }
        }
    }
}

試行錯誤がたくさんありますが、残念ながらそれは機能します多くの皆さんがこれをより良く、大幅に速く行うことができたと確信しています。うまくいけば、私はスピードを上げるでしょう。

では、どうすれば自分の仕事に賛成票を投じ、自分の解決策を受け入れることができますか?!

4

1 に答える 1

1

array_filter()を使用することをお勧めします。まず、無視する値を認識する関数を作成します。

function shouldIgnore($value) {
  return !in_array($value, array('throw', 'punt'));
}

次に、次のようにフィルタリングします。

$data["rules1.txt"]["rules"] = array_filter($data["rules1.txt"]["rules"], "shouldIgnore");
于 2012-12-19T23:37:44.900 に答える