簡體   English   中英

PHP幫助構建零件號

[英]php help constructing part numbers

我需要根據說明創建大量零件編號,以了解如何構造它們。 這是兩個例子。

  • APXE-N-300-025-A0-12-ET-OO
  • APXE-N-300-050-A0-12-ET-OO

每個零件號都分為以下幾個部分: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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM