[英]php help constructing part numbers
我需要根據說明創建大量零件編號,以了解如何構造它們。 這是兩個例子。
每個零件號都分為以下幾個部分:0-1-2-3-4-5-6,並且某些零件具有依賴性,其中根據先前零件的值,對該特定零件有一個受限的選擇。
這是我到目前為止擁有的php。 我有一個包含模式的數組,但是我正在努力創建輸出所有選項的循環:
$parts[0] = array('APXE');
$parts[1] = array('N','P',"S");
$parts[2] = array('300','400','600','700','800','900','1G4','1G8','2G0','2G5');
$parts[3] = array(
array('dependIndex'=>'2','dependVal'=>'300','values'=>array('025','050','075','150','200','250','500','1M0','1M7','3M5')),
array('dependIndex'=>'2','dependVal'=>'400','values'=>array('025','050','075','150','200','250','500','1M0','1M7','3M5')),
array('dependIndex'=>'2','dependVal'=>'600','values'=>array('1M7','3M5')),
array('dependIndex'=>'2','dependVal'=>'700','values'=>array('200','250','500','1M0','1M7','3M5')),
array('dependIndex'=>'2','dependVal'=>'800','values'=>array('075','150','200','250','500','1M0','1M7','3M5')),
array('dependIndex'=>'2','dependVal'=>'900','values'=>array('025','050','075','150','200','250','500','1M0','1M7','3M5')),
array('dependIndex'=>'2','dependVal'=>'1G4','values'=>array('075','150','250','500','1M0','1M7','3M5','7M0')),
array('dependIndex'=>'2','dependVal'=>'1G8','values'=>array('250','500','1M0','1M7','3M5','7M0','14M')),
array('dependIndex'=>'2','dependVal'=>'2G0','values'=>array('250','500','1M0','1M7','3M5','7M0','14M')),
array('dependIndex'=>'2','dependVal'=>'2G5','values'=>array('250','500','1M0','1M7','3M5','7M0','14M'))
);
$parts[4] = array(
array('dependIndex'=>'2','dependVal'=>'300','values'=>array('A0','A1','A2')),
array('dependIndex'=>'2','dependVal'=>'400','values'=>array('B0','B1','B2','C0')),
array('dependIndex'=>'2','dependVal'=>'600','values'=>array('D0')),
array('dependIndex'=>'2','dependVal'=>'700','values'=>array('E0')),
array('dependIndex'=>'2','dependVal'=>'800','values'=>array('F0')),
array('dependIndex'=>'2','dependVal'=>'900','values'=>array('G0','G2','G3','G4')),
array('dependIndex'=>'2','dependVal'=>'1G4','values'=>array('H0','H1')),
array('dependIndex'=>'2','dependVal'=>'1G8','values'=>array('K0')),
array('dependIndex'=>'2','dependVal'=>'2G0','values'=>array('I0')),
array('dependIndex'=>'2','dependVal'=>'2G5','values'=>array('J0','J1'))
);
$parts[5] = array('12','1L','24','48','AC');
$parts[6] = array('ET','FC','IC','FI','NT');
$parts[7] = array('OO');
foreach($parts as $part)
foreach ($part as $bit){
if(!is_array($bit) $list[] = $bit;
else foreach($bit['values'] as $val) $list[] = $val;
} //??
在上面的'dependIndex'=>'2'中,'dependVal'=>'300'表示對於第二段中所有帶有'300'的部件號,第三段可以具有該數組的所有值。
我正在尋找一個足夠靈活的PHP函數,以在段數變化時處理它。 依賴關系也會改變。 因此,在以上示例中,4可能取決於3,6可能取決於1。
誰能說遞歸? 大聲笑
任何幫助是極大的贊賞。
首先,我認為最好查看是否可以使用array_rand()
生成一個零件號,該array_rand()
從數組中選擇一個或多個隨機條目。 稍后,您可以修改代碼以使用遞歸或嵌套的foreach
輸出所有可能的部分。
foreach ($parts as $part)
{
if (!is_array($part[0]))
$list[] = array_rand($part);
else
{
$val = "UNKNOWN";
// Handle dependencies by looking back to the relevant section of
// the current part number that is being generated.
foreach ($part as $bit)
if ($list[$bit['dependIndex']] == $bit['dependVal'])
$val = array_rand($bit['values']);
$list[] = $val;
}
}
var_dump($list);
生成所有可能的零件是一個相當困難的問題。 如果這是一個家庭作業問題,您的教授必須對您充滿信心!
您希望執行2種功能。 一種用於解決依賴性,另一種用於數字生成。
給定以下模型中的依賴項:
$dependencies = array(
'300'=>array(
0=>array('025','050','075','150','200','250','500','1M0','1M7','3M5'),
1=>array('A0','A1','A2')
),
'400'=>array(
0=>array('025','050','075','150','200','250','500','1M0','1M7','3M5'),
1=>array('B0','B1','B2','C0')
),
'600'=>array(
0=>array('1M7','3M5'),
1=>array('D0')
),
'700'=>array(
0=>array('200','250','500','1M0','1M7','3M5'),
1=>array('E0')
),
'800'=>array(
0=>array('075','150','200','250','500','1M0','1M7','3M5'),
1=>array('F0')
),
'900'=>array(
0=>array('025','050','075','150','200','250','500','1M0','1M7','3M5'),
1=>array('G0','G2','G3','G4')
),
'1G4'=>array(
0=>array('075','150','250','500','1M0','1M7','3M5','7M0'),
1=>array('H0','H1')
),
'1G8'=>array(
0=>array('250','500','1M0','1M7','3M5','7M0','14M'),
1=>array('H0','H1')
),
'2G0'=>array(
0=>array('250','500','1M0','1M7','3M5','7M0','14M'),
1=>array('I0')
),
'2G5'=>array(
0=>array('250','500','1M0','1M7','3M5','7M0','14M'),
1=>array('J0','J1')
)
);
您可以創建一個將位置3、4和5組合為預先計算的字符串的函數:
function position3($arrays){
$retVal = array();
foreach ($arrays as $key=>$value){
foreach ($value[0] as $v1){
foreach ($value[1] as $v2){
array_push($retVal, $key . '-' . $v1 . '-' . $v2);
}
}
}
return $retVal;
}
將位置3組合到所有已定義的突變中,可以將位置映射到數組模型中,如下所示:
$parts[0] = array('APXE');
$parts[1] = array('N','P',"S");
$parts[2] = position3($dependencies);
$parts[3] = array('12','1L','24','48','AC');
$parts[4] = array('ET','FC','IC','FI','NT');
$parts[5] = array('OO');
然后,您可以調用循環函數,該循環函數使用此函數構建組合值的每個排列(總計13275):
function go($parts){
$total = 0;
foreach ($parts[0] as $pos1){
foreach ($parts[1] as $pos2){
foreach ($parts[2] as $pos3){
foreach ($parts[3] as $pos4){
foreach ($parts[4] as $pos5){
foreach ($parts[5] as $pos6 ){
echo implode('-', [$pos1,$pos2,$pos3,$pos4,$pos5,$pos6 ])."\n";
$total++;
}
}
}
}
}
}
echo $total;
}
將所有這些放在一起將使:
function position3($arrays){
$retVal = array();
foreach ($arrays as $key=>$value){
foreach ($value[0] as $v1){
foreach ($value[1] as $v2){
#echo $key . '-' . $v1 . '-' . $v2 . "\n";
array_push($retVal, $key . '-' . $v1 . '-' . $v2);
}
}
}
return $retVal;
}
$dependencies = array(
'300'=>array(
0=>array('025','050','075','150','200','250','500','1M0','1M7','3M5'),
1=>array('A0','A1','A2')
),
'400'=>array(
0=>array('025','050','075','150','200','250','500','1M0','1M7','3M5'),
1=>array('B0','B1','B2','C0')
),
'600'=>array(
0=>array('1M7','3M5'),
1=>array('D0')
),
'700'=>array(
0=>array('200','250','500','1M0','1M7','3M5'),
1=>array('E0')
),
'800'=>array(
0=>array('075','150','200','250','500','1M0','1M7','3M5'),
1=>array('F0')
),
'900'=>array(
0=>array('025','050','075','150','200','250','500','1M0','1M7','3M5'),
1=>array('G0','G2','G3','G4')
),
'1G4'=>array(
0=>array('075','150','250','500','1M0','1M7','3M5','7M0'),
1=>array('H0','H1')
),
'1G8'=>array(
0=>array('250','500','1M0','1M7','3M5','7M0','14M'),
1=>array('H0','H1')
),
'2G0'=>array(
0=>array('250','500','1M0','1M7','3M5','7M0','14M'),
1=>array('I0')
),
'2G5'=>array(
0=>array('250','500','1M0','1M7','3M5','7M0','14M'),
1=>array('J0','J1')
)
);
$parts[0] = array('APXE');
$parts[1] = array('N','P',"S");
$parts[2] = position3($dependencies);
$parts[3] = array('12','1L','24','48','AC');
$parts[4] = array('ET','FC','IC','FI','NT');
$parts[5] = array('OO');
function go($parts){
$total = 0;
foreach ($parts[0] as $pos1){
foreach ($parts[1] as $pos2){
foreach ($parts[2] as $pos3){
foreach ($parts[3] as $pos4){
foreach ($parts[4] as $pos5){
foreach ($parts[5] as $pos6 ){
echo implode('-', [$pos1,$pos2,$pos3,$pos4,$pos5,$pos6 ])."\n";
$total++;
}
}
}
}
}
}
echo $total;
}
go($parts);
我想我知道您在這里想要什么...這是一種非常蠻力的處理方式,但是應該可以:
<?php
$parts[0] = array('APXE');
$parts[1] = array('N','P',"S");
$parts[2] = array('300','400','600','700','800','900','1G4','1G8','2G0','2G5');
$parts[3] = array(
array('dependIndex'=>'2','dependVal'=>'300','values'=>array('025','050','075','150','200','250','500','1M0','1M7','3M5')),
array('dependIndex'=>'2','dependVal'=>'400','values'=>array('025','050','075','150','200','250','500','1M0','1M7','3M5')),
array('dependIndex'=>'2','dependVal'=>'600','values'=>array('1M7','3M5')),
array('dependIndex'=>'2','dependVal'=>'700','values'=>array('200','250','500','1M0','1M7','3M5')),
array('dependIndex'=>'2','dependVal'=>'800','values'=>array('075','150','200','250','500','1M0','1M7','3M5')),
array('dependIndex'=>'2','dependVal'=>'900','values'=>array('025','050','075','150','200','250','500','1M0','1M7','3M5')),
array('dependIndex'=>'2','dependVal'=>'1G4','values'=>array('075','150','250','500','1M0','1M7','3M5','7M0')),
array('dependIndex'=>'2','dependVal'=>'1G8','values'=>array('250','500','1M0','1M7','3M5','7M0','14M')),
array('dependIndex'=>'2','dependVal'=>'2G0','values'=>array('250','500','1M0','1M7','3M5','7M0','14M')),
array('dependIndex'=>'2','dependVal'=>'2G5','values'=>array('250','500','1M0','1M7','3M5','7M0','14M'))
);
$parts[4] = array(
array('dependIndex'=>'2','dependVal'=>'300','values'=>array('A0','A1','A2')),
array('dependIndex'=>'2','dependVal'=>'400','values'=>array('B0','B1','B2','C0')),
array('dependIndex'=>'2','dependVal'=>'600','values'=>array('D0')),
array('dependIndex'=>'2','dependVal'=>'700','values'=>array('E0')),
array('dependIndex'=>'2','dependVal'=>'800','values'=>array('F0')),
array('dependIndex'=>'2','dependVal'=>'900','values'=>array('G0','G2','G3','G4')),
array('dependIndex'=>'2','dependVal'=>'1G4','values'=>array('H0','H1')),
array('dependIndex'=>'2','dependVal'=>'1G8','values'=>array('K0')),
array('dependIndex'=>'2','dependVal'=>'2G0','values'=>array('I0')),
array('dependIndex'=>'2','dependVal'=>'2G5','values'=>array('J0','J1'))
);
$parts[5] = array('12','1L','24','48','AC');
$parts[6] = array('ET','FC','IC','FI','NT');
$parts[7] = array('OO');
foreach($parts[1] as $eigth){
foreach($parts[2] as $sect){
foreach($parts[3] as $keya => $firstloop){
foreach($parts[3][$keya] as $itemone){
foreach($parts[3][$keya]['values'] as $firstselector){
foreach($parts[4] as $keyb => $secondloop){
foreach($parts[4][$keyb] as $itemtwo){
foreach($parts[4][$keyb]['values'] as $secondselector){
foreach($parts[5] as $halve){
foreach($parts[6] as $quarter){
if($sect == $parts[3][$keya]['dependVal'] && $sect == $parts[3][$keyb]['dependVal']){
echo $parts[0][0] . "-" . $eigth . "-" . $sect . "-" . $firstselector . "-" . $secondselector . "-" . $halve . "-" . $quarter . "<br>";
}
}
}
}
}
}
}
}
}
}
}
?>
我在Facebook上看到您懇求指向該帖子的幫助,並決定對此表示歡迎。
我更改了列出您的依賴項的方式,但是我相信它可以正常工作(盡管有點倉促和類似蠻力的行為)。 希望它將為您提供一個良好的起點。
/*
* The following arrays should be formatted thusly:
* $exclusionlist[indexOfDeterminingColumn][indexOfDependentColumn] = array(
* 'ValueOfDeterminingColumn' => array('list', 'of', 'valid', 'values')
* );
*/
$dependencyList[3][2] = array(
'300' => array('025','050','075','150','200','250','500','1M0','1M7','3M5'),
'400' => array('025','050','075','150','200','250','500','1M0','1M7','3M5'),
'600' => array('1M7','3M5'),
'700' => array('200','250','500','1M0','1M7','3M5'),
'800' => array('075','150','200','250','500','1M0','1M7','3M5'),
'900' => array('025','050','075','150','200','250','500','1M0','1M7','3M5'),
'1G4' => array('075','150','250','500','1M0','1M7','3M5','7M0'),
'1G8' => array('250','500','1M0','1M7','3M5','7M0','14M'),
'2G0' => array('250','500','1M0','1M7','3M5','7M0','14M'),
'2G5' => array('250','500','1M0','1M7','3M5','7M0','14M')
);
$dependencyList[4][2] = array(
'300' => array('A0','A1','A2'),
'400' => array('B0','B1','B2','C0'),
'600' => array('D0'),
'700' => array('E0'),
'800' => array('F0'),
'900' => array('G0','G2','G3','G4'),
'1G4' => array('H0','H1'),
'1G8' => array('K0'),
'2G0' => array('I0'),
'2G5' => array('J0','J1')
);
$dependencyList[5][1] = array(
'N' => array('12'),
'P' => array('1L'),
'S' => array('24')
);
// $segments contains lists of all valid values for each segment of the part number
$segments[0] = array('APXE');
$segments[1] = array('N','P',"S");
$segments[2] = array('300','400','600','700','800','900','1G4','1G8','2G0','2G5');
$segments[3] = array('025','050','075','14M','150','1M0','1M7','200','250','3M5','500','7M0');
$segments[4] = array('A0','A1','A2','B0','B1','B2','C0','D0','E0','F0','G0','G2','G3','G4','H0','H1','I0','J0','J1','K0');
$segments[5] = array('12','1L','24','48','AC');
$segments[6] = array('ET','FC','IC','FI','NT');
$segments[7] = array('OO');
$partNumbers = array();
// Loop through each segment's array
foreach($segments[0] as $segment0)
if(!testForExclusion(${'segment'.key($dependencyList[0])}, key($dependencyList[0]), $segment0, 0, $dependencyList))
foreach($segments[1] as $segment1)
if(!testForExclusion(${'segment'.key($dependencyList[1])}, key($dependencyList[1]), $segment1, 1, $dependencyList))
foreach($segments[2] as $segment2)
if(!testForExclusion(${'segment'.key($dependencyList[2])}, key($dependencyList[2]), $segment2, 2, $dependencyList))
foreach($segments[3] as $segment3)
if(!testForExclusion(${'segment'.key($dependencyList[3])}, key($dependencyList[3]), $segment3, 3, $dependencyList))
foreach($segments[4] as $segment4)
if(!testForExclusion(${'segment'.key($dependencyList[4])}, key($dependencyList[4]), $segment4, 4, $dependencyList))
foreach($segments[5] as $segment5)
if(!testForExclusion(${'segment'.key($dependencyList[5])}, key($dependencyList[5]), $segment5, 5, $dependencyList))
foreach($segments[6] as $segment6)
if(!testForExclusion(${'segment'.key($dependencyList[6])}, key($dependencyList[6]), $segment6, 6, $dependencyList))
foreach($segments[7] as $segment7)
if(!testForExclusion(${'segment'.key($dependencyList[7])}, key($dependencyList[7]), $segment7, 7, $dependencyList))
$partNumbers[] = $segment0.'-'.$segment1.'-'.$segment2.'-'.$segment3.'-'.$segment4.'-'.$segment5.'-'.$segment6.'-'.$segment7;
echo count( $partNumbers );
echo '<p>';
echo implode('<br/>', $partNumbers);
function testForExclusion($determiningValue, $determiningSegment, $testValue, $testSegment, $exclusionList){
$excluded = false;
if(isset($exclusionList[$testSegment][$determiningSegment][$determiningValue])){
if(!in_array($testValue, $exclusionList[$testSegment][$determiningSegment][$determiningValue])){
$excluded = true;
}
}
return $excluded;
}
編輯:數據結構和依賴項功能應該能夠用於依賴項的任何組合,因此該解決方案應該是可擴展的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.