Что-то не так с циклом - получение Превышено максимальное время выполнения 30 секунд? - PullRequest
3 голосов
/ 29 мая 2019

Просто хочу проверить, что я делаю что-то не так, потому что для небольшого набора данных функция работает нормально, но немного больше записей, и я получаю максимальную ошибку времени выполнения;

function getValue($products, $storeNum, $productKey) {
    foreach($products as $row)
    {
      if((int)$row->name === (int)$storeNum && (int)$row->product_key === (int)$productKey)
      {
        return $row->value;
      }
    }
    return 0;
}   

Массив Input $ products выглядит следующим образом:

Array
(
    [0] => stdClass Object
        (
            [value] => 0
            [name] => 3195
            [product_key] => 13                
        )

)

PS: функция getvalue () вызывается в другом цикле, который создает матрицу 400 (хранится как ось Y) на 50 (имена продуктов по оси X)

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Звучит так, как будто вы вызываете функцию getValue 20000 раз и повторяете (в худшем случае) весь массив продуктов каждый раз.

Это должно происходить намного быстрее, если вы строите матрицу за одну итерацию$products.Вот основной способ сделать это:

function makeMatrix($stores, $product_names, $products) {
    $matrix = [];

    // create the matrix from the lists of stores and product names
    foreach ($stores as $store) {
        foreach ($product_names as $product_name) {
            $matrix[$store][$product_name] = 0;
        }
    }

    // fill the matrix with the list of products
    foreach ($products as $product) {
        $matrix[$product->name][$product->product_key] = $product->value;
    }
    return $matrix;
}

Я думаю, что это должно быть быстрее, потому что оно работает так:

count(stores) * count(product_names) + count(products)

И моя теория такова, что выв настоящее время это работает так:

count(stores) * count(product_names) * triangular_number(count(products))
0 голосов
/ 29 мая 2019

Если массив $ products должен поддерживать этот конкретный формат, вот наиболее эффективный метод получения значения продукта из миллионов записей:

function getValue($products, $name, $productKey) {
    return ($search = explode('"name":' . $name . ',"product_key":' . $productKey, json_encode($products))) && (next($search) !== false) ? rtrim(substr($search[0], strrpos($search[0], '":') + 2), ',') : false;
}

Пример массива продукта:

$products = array(
    (object) array(
        'value' => 0,
        'name' => 13,
        'product_key' => 3195
    ),
    (object) array(
        'value' => 20,
        'name' => 14,
        'product_key' => 3196
    ),
    (object) array(
        'value' => 40,
        'name' => 15,
        'product_key' => 3197
    )
);

Получение значения с именем продукта и ключом (возвращает false, если значение не найдено):

$productValue = getValue($products, 14, 3196);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...