我目前正在開發一個 Symfony 6.1 專案,我正在嘗試在 PHP 8.1 中構建一個相當大的陣列。現在原理基本有效,結構正確。但是,如果每個 foreach 回圈的執行次數越來越多,就會出現關于執行時間和所需記憶體的問題。
在我當前的代碼中,您可以在下面看到,我還將每個 foreach 回圈的值的數量作為旁邊的注釋說明。
我當前的代碼:
$data = array();
foreach($variantInformations as $key => $value) { //Between 1-7 values
foreach($value["sizes"] as $key2 => $value2) { //Between 1-7 values
foreach($value["colors"] as $key3 => $value3) {
if(isset($value3["printColors"])) { //Between 1*88 - 8*88 values
foreach($value3["printColors"] as $key4 => $value4) {
if(isset($value["printMotifs"])) {
foreach($value["printMotifs"] as $key5 => $value5) { //Between 100-300 values
if($value5["colorLevel"] == "1") {
if(!isset($value4["secondPrintColorId"])) {
$data[$key][$key2][$key3][$key4][$key5]["number"] = $variantInformations[$key]["number"]."-".$value2."-".$value3["bodyColor"]["id"]."-".$value4["id"]."-".$value5["id"];
$data[$key][$key2][$key3][$key4][$key5]["title"] = $variantInformations[$key]["title"]."-".$value2."-".$value3["bodyColor"]["title"]."-".$value4["title"]."-".$value5["title"];
$data[$key][$key2][$key3][$key4][$key5]["bodyColor"] = $value3["bodyColor"]["id"];
$data[$key][$key2][$key3][$key4][$key5]["printColor"] = $value4["id"];
$data[$key][$key2][$key3][$key4][$key5]["printMotif"] = $value5["id"];
$data[$key][$key2][$key3][$key4][$key5]["article"] = $this->articleRepository->findOneBy(["number" => $variantInformations[$key]["number"]]);
$data[$key][$key2][$key3][$key4][$key5]["active"] = 0;
$data[$key][$key2][$key3][$key4][$key5]["size"] = $value2;
$data[$key][$key2][$key3][$key4][$key5]["stock"] = "no";
$data[$key][$key2][$key3][$key4][$key5]["assortment"][] = $value["assortment"][0];
$data[$key][$key2][$key3][$key4][$key5]["printMotifStatus"] = $value5["status"];
}
}
elseif ($value5["colorLevel"] == "2") {
if(isset($value4["secondPrintColorId"])) {
$data[$key][$key2][$key3][$key4][$key5]["number"] = $variantInformations[$key]["number"]."-".$value2."-".$value3["bodyColor"]["id"]."-".$value4["id"]."-".$value4["secondPrintColorId"]."-".$value5["id"];
$data[$key][$key2][$key3][$key4][$key5]["title"] = $variantInformations[$key]["title"]."-".$value2."-".$value3["bodyColor"]["title"]."-".$value4["title"]."-".$value4["secondPrintColorTitle"]."-".$value5["title"];
$data[$key][$key2][$key3][$key4][$key5]["bodyColor"] = $value3["bodyColor"]["id"];
$data[$key][$key2][$key3][$key4][$key5]["printColor"] = $value4["id"];
$data[$key][$key2][$key3][$key4][$key5]["secondPrintColorId"] = $value4["secondPrintColorId"];
$data[$key][$key2][$key3][$key4][$key5]["printMotif"] = $value5["id"];
$data[$key][$key2][$key3][$key4][$key5]["article"] = $this->articleRepository->findOneBy(["number" => $variantInformations[$key]["number"]]);
$data[$key][$key2][$key3][$key4][$key5]["active"] = 0;
$data[$key][$key2][$key3][$key4][$key5]["size"] = $value2;
$data[$key][$key2][$key3][$key4][$key5]["stock"] = "no";
$data[$key][$key2][$key3][$key4][$key5]["assortment"][] = $value["assortment"][0];
$data[$key][$key2][$key3][$key4][$key5]["printMotifStatus"] = $value5["status"];
}
}
}
}
}
}
}
}
}
目前我正在考慮如何讓這個程序更快,如何優化它,或者它是否需要完全不同的方法。
有沒有人有任何想法或建議?
uj5u.com熱心網友回復:
您可以減少訪問次數。
if (!isset($value4["secondPrintColorId"])) {
$data[$key][$key2][$key3][$key4][$key5] = [
'number' => $variantInformations[$key]["number"] . "-" . $value2 . "-" . $value3["bodyColor"]["id"] . "-" . $value4["id"] . "-" . $value5["id"],
'title' => $variantInformations[$key]["title"] . "-" . $value2 . "-" . $value3["bodyColor"]["title"] . "-" . $value4["title"] . "-" . $value5["title"],
'bodyColor' => $value3["bodyColor"]["id"],
'printColor' => $value4["id"],
'printModel' => $value5["id"],
'article' => $this->articleRepository->findOneBy(["number" => $variantInformations[$key]["number"]]),
'active' => 0,
'size' => $value2,
'stock' => 'no',
'assortment' => [$value["assortment"][0]],
'printMotifStatus' => $value5["status"],
];
}
findOneBy()你也在回圈中呼叫資料庫。這很慢。您可以在多次使用時快取它們,也可以進行一次查詢而不是成百上千。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/511495.html
標籤:php数组表现交响乐
