3

さて、eval() の使用が良くないことはわかっていますが、私の問題に対するより良い解決策を思いつくことができませんでした。最近まで、それを使用しないパフォーマンス上の理由はありませんでした。ただし、関数に十分なデータを渡しているため、許容できないほど時間がかかります。

呼び出されている関数は次のとおりです。

public static function makeAMultiDimensionalArrayWithSumsBasedOnMultipleFields($inArray, $dimensionFieldNames, $sumFieldNameArray, $staticFieldNameArray = array())
{
    $outArray = array();

    // Just in case the array has indices, sort it so array_pop works as expected.
    ksort($dimensionFieldNames);

    foreach ($inArray as $row)
    {
        // make sure each row in the inArray has all keys specified by $dimensionFieldNames
        $allFieldsPresent = TRUE;
        foreach ($dimensionFieldNames as $keyFieldName)
        {
            if (!array_key_exists($keyFieldName, $row))
            {
                // Note that alternatively we could set the field to a specified default value.
                $allFieldsPresent = FALSE;
            }
        }

        if ($allFieldsPresent)
        {
            $indexString = '';
            $keyFieldNameArrayCopy = $dimensionFieldNames;

            foreach ($dimensionFieldNames as $keyFieldName)
            {
                $indexString .= "['" . $row[$keyFieldName] . "']";
                // lets sum values
                foreach ($sumFieldNameArray as $sumFieldName)
                {
                    eval ('$outArray' . $indexString . '[' . $sumFieldName . '] += $row[' . $sumFieldName . '];');
                }

                foreach ($staticFieldNameArray as $staticFieldName)
                {
                    eval ('$outArray' . $indexString . '[' . $staticFieldName . '] = $row[' . $staticFieldName . '];');
                }
            }
        }

    }
    return $outArray;
}

次のように呼び出されています。

makeAMultiDimensionalArrayWithSumsBasedOnMultipleFields($data, $dimensionArray, $sumArray, $staticArray);

関数に渡される変数は次のようになります。

$dimensionArray = array("firstLevelID", "secondLevelID", "thirdLevelID", "fourthLevelID", "fifthLevelID");
$sumArray = array("revenue", "cost", "profit", "sales", "inquires", "cost", "walkins");
$staticArray = array("date", "storeID", "storeName", "productID", "productName", "managerID", "managerName", "salesperson");

そのため、eval() を使用しないように関数を書き直したいと思います。私はこれにかなりの時間を費やしてきましたが、アドバイスを求める時が来たと感じています。

目標は、配列の配列を取り、それを $dimensionArray の次元に基づいて多次元配列に変換することです。

今はあまり詳細を説明して退屈させたくありませんので、さらに詳しく知りたい場合や他に質問がある場合はお尋ねください。

4

2 に答える 2

3

うわー、わかりました。初めて、索引付けの連結を見逃しました。これを試して:

if ($allFieldsPresent) {
    $keys = array();
    foreach ($dimensionFieldNames as $keyFieldName) {
        $keys[] = $row[$keyFieldName];
        // lets sum values
        foreach ($sumFieldNameArray as $sumFieldName)
            self::deepAssign($outArray, $keys, $sumFieldName, $row[$sumFieldName], true);
        foreach ($staticFieldNameArray as $staticFieldName)
            self::deepAssign($outArray, $keys, $staticFieldName, $row[$staticFieldName]);
    }
}

protected static function deepAssign(&$array, $keys, $fieldName, $value, $sum = false) {
    $target =& $array;
    foreach ($keys as $key) {
        if (!isset($target[$key]))
            $target[$key] = array();
        $target =& $target[$key];
    }
    if($sum)
        $target[$fieldName] += $value;
    else
        $target[$fieldName] = $value;
}
于 2012-07-05T21:19:03.550 に答える
-1

あなたは見る必要がありますcreate_function()docs here )

于 2012-07-05T21:17:20.743 に答える