PHP-如何获取数组/链表中的所有可能序列

PHP-如何获取数组/链表中的所有可能序列,php,Php,基本上,我想在我的应用程序中创建一条历史路线,我尝试过,但失败了 现在我决定只使用一个数组 假设有一个数组$array=[0,1,2,3]。我想生成具有以下条件的所有序列 $result = [ [ 'sequence' => [0,1], 'start' => 0, 'finish' => 1, 'via' => 'direct' 'transit' => null ], [ 'sequence' =&

基本上,我想在我的应用程序中创建一条历史路线,我尝试过,但失败了

现在我决定只使用一个数组

假设有一个数组
$array=[0,1,2,3]。我想生成具有以下条件的所有序列

$result = [
  [
    'sequence' => [0,1],
    'start' => 0,
    'finish' => 1,
    'via' => 'direct'
    'transit' => null
  ],

  [
    'sequence' => [0,1,2],
    'start' => 0,
    'finish' => 2,
    'via' => 'transit',
    'transit' => [1]
  ],
  [
    'sequence' => [0,1,2,3],
    'start' => 0,
    'finish' => 3,
    'via' => 'transit',
    'transit' => [1,2]
  ],
  [
    'sequence' => [1,2],
    'start' => 1,
    'finish' => 2,
    'via' => 'direct'
    'transit' => null
  ],
  [
    'sequence' => [1,2,3],
    'start' => 1,
    'finish' => 3,
    'via' => 'transit'
    'transit' => [2]
  ],
  [
    'sequence' => [2,3],
    'start' => 2,
    'finish' => 3,
    'via' => 'direct'
    'transit' => null
  ],

];

通过使用外循环和内循环,可以达到所需的结果:

$result = [];
$array = [0, 1, 2, 3];
$arrayCount = count($array);

for ($i = 0; $i < $arrayCount - 1; $i++) {

    for ($j = 0; $j < $arrayCount - $i - 1; $j++) {

        $arr = array_slice($array, $i, $j + 2);
        $count = count($arr);
        $direct = $count === 2;
        
        $result[] = [
            'sequence' => $arr,
            'start'    => $arr[0],
            'finish'   => $arr[$count - 1],
            'via'      => $direct ? 'direct' : 'transit',
            'transit'  => $direct ? null : array_slice($arr, 1, $count - 2)
        ];
    }
}
$result=[];
$array=[0,1,2,3];
$arrayCount=计数($array);
对于($i=0;$i<$arrayCount-1;$i++){
对于($j=0;$j<$arrayCount-$i-1;$j++){
$arr=数组×切片($array,$i,$j+2);
$count=计数($arr);
$direct=$count==2;
$result[]=[
“序列”=>$arr,
“开始”=>$arr[0],
“完成”=>$arr[$count-1],
'通过'=>$direct?'direct':'中转',
“transit”=>$direct?空:数组\u切片($arr,1,$count-2)
];
}
}

如果要生成许多序列,并且必须考虑内存使用情况,那么也可以使用生成器:

function sequenceGenerator(array $array): iterator
{
    $arrayCount = count($array);
    
    for ($i = 0; $i < $arrayCount - 1; $i++) {

        for ($j = 0; $j < $arrayCount - $i - 1; $j++) {

            $arr = array_slice($array, $i, $j + 2);
            $count = count($arr);
            $direct = $count === 2;
            
            yield [
                'sequence' => $arr,
                'start'    => $arr[0],
                'finish'   => $arr[$count - 1],
                'via'      => $direct ? 'direct' : 'transit',
                'transit'  => $direct ? null : array_slice($arr, 1, $count - 2)
            ];
        }
    }
}

foreach (sequenceGenerator([0, 1, 2, 3]) as $sequence) {
    // Do something here, maybe store it to db?
    var_dump($sequence);
}
函数序列生成器(数组$array):迭代器
{
$arrayCount=计数($array);
对于($i=0;$i<$arrayCount-1;$i++){
对于($j=0;$j<$arrayCount-$i-1;$j++){
$arr=数组×切片($array,$i,$j+2);
$count=计数($arr);
$direct=$count==2;
屈服[
“序列”=>$arr,
“开始”=>$arr[0],
“完成”=>$arr[$count-1],
'通过'=>$direct?'direct':'中转',
“transit”=>$direct?空:数组\u切片($arr,1,$count-2)
];
}
}
}
foreach(sequenceGenerator([0,1,2,3])作为$sequence){
//在这里做点什么,也许把它存储到数据库?
变量转储($序列);
}

不错。谢谢让我先试试。它很有魅力。