簡體   English   中英

數組排列,同時保持標題

[英]Array permutations while maintaining headings

我有一個包含任意數量的元素的數組,並且也可以是多維數組。 我的此類數組數據的測試示例為:

$arr = array(
         array('Material-A', 'Material-B'),
         array('Profile-A', 'Profile-B', 'Profile-C'),
         array('Thread-A', 'Thread-B'),
         // ... any number of elements
        );

從這個多維數組中,我需要創建一個線性數組,其格式如下。

$arrFormated = array(
                 'Material-A',
                 'Material-A_Profile-A',
                 'Material-A_Profile-A_Thread-A',
                 'Material-A_Profile-A_Thread-B',
                 'Material-A_Profile-A_Thread-C',
                 'Material-A_Profile-B',
                 'Material-A_Profile-B_Thread-A',
                 'Material-A_Profile-B_Thread-B',
                 'Material-A_Profile-B_Thread-C',
                 'Material-A_Profile-C',
                 'Material-A_Profile-C_Thread-A',
                 'Material-A_Profile-C_Thread-B',
                 'Material-A_Profile-C_Thread-C',
                 'Material-B',
                 'Material-B_Profile-A',
                 'Material-B_Profile-A_Thread-A'
                 // Repeat similar pattern found above, etc...
               );

對於遞歸函數,到目前為止我能想到的最好的方法如下:

    private function showAllElements($arr)
    {
        for($i=0; $i < count($arr); $i++)
        {
            $element = $arr[$i];
            if (gettype($element) == "array") {
                $this->showAllElements($element);
            } else {
                echo $element . "<br />";
            }
        }
    }

但是,此代碼離產生我想要的結果不遠。 上面代碼的結果是。

Material-A
Material-B
Profile-A
Profile-B
Profile-C
Thread-A
Thread-B

有人可以在此函數的遞歸方面幫助我,以便獲得期望的結果嗎?

我一般會建議想你想成為什么樣的遞歸。 您嘗試在每個遞歸步驟中使用當前元素 ,但是您的方法需要在每個遞歸步驟中查看原始Array的下一個 array元素。 在這種情況下,它更有益的索引傳遞給您的遞歸函數,因為“當前元素(在$arrshowAllElements($arr)是無益的。

我認為這段代碼應該做到這一點:

$exampleArray = array(
         array('Material-A', 'Material-B'),
         array('Profile-A', 'Profile-B', 'Profile-C'),
         array('Thread-A', 'Thread-B','Thread-C'),
         // ... any number of elements
        );

class StackOverflowQuestion37823464{
    public $array;
    public function dumpElements($level = 0 /* default parameter: start at first element if no index is given */){
        $return=[];
        if($level==count($this->array)-1){ 
            $return=$this->array[$level]; /* This is the anchor of the recursion. If the given index is the index of the last array element, no recursion is neccesarry */
        }else{
            foreach($this->array[$level] as $thislevel) { /* otherwise, every element of the current step will need to be concatenated... */
                $return[]=$thislevel;
                foreach($this->dumpElements($level+1) as $stringifyIt){ /*...with every string from the next element and following elements*/
                    $return[]=$thislevel.'_'.$stringifyIt;
                }
            }
        }
        return $return;
    }
}
$test=new StackOverflowQuestion37823464();
$test->array=$exampleArray;
var_dump($test->dumpElements());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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