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

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;
}   

Входной массив $ products выглядит следующим образом:

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

)

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

2
Just_Do_It 29 Май 2019 в 22:07

2 ответа

Лучший ответ

Похоже, вы вызываете функцию 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))
1
Don't Panic 29 Май 2019 в 20:55

Если массив $ 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);
0
user11487450user11487450 29 Май 2019 в 20:55
56367019