Когда я бегу
use Data::Dumper;
$Data::Dumper::Terse = 1;
$Data::Dumper::Indent = 0;
my @x = (1,2,3,4);
my @y = find_all_subsets(@x);
foreach my $subset (@y) {
print Dumper($subset), "\n";
}
(+ оригинальный скрипт) вывод
[1]
[1,4]
[1,3]
[1,3,4]
[1,2]
[1,2,4]
[1,2,3]
[1,2,3,4]
[2]
[2,4]
[2,3]
[2,3,4]
[3]
[3,4]
[4]
Обратите внимание на [] в выходных данных, мы вернемся к ним позже.
function find_all_subsets (array $x) {
if ( 1>= count($x) ) { // the >= differs from the original script, use == or === if you want to keep it "more original"
return array($x);
}
else {
$all_subsets = array();
$last_item = array_pop($x);
$first_subsets = find_all_subsets($x) ;
foreach ($first_subsets as $subset) {
array_push($all_subsets, $subset);
array_push($subset, $last_item);
array_push($all_subsets, $subset);
}
array_push ($all_subsets, array($last_item));
return $all_subsets;
}
}
$x = array(1,2,3,4);
$y = find_all_subsets($x);
foreach($y as $subset) {
echo '(', join(',', $subset), ")\n";
}
1010 * производит *
(1)
(1,4)
(1,3)
(1,3,4)
(1,2)
(1,2,4)
(1,2,3)
(1,2,3,4)
(2)
(2,4)
(2,3)
(2,3,4)
(3)
(3,4)
(4)
пока все хорошо. Теперь вернемся к []. Data :: Dumper выбрал this [], а не (), потому что это не массив, а ссылка на массив (обнажите меня, если я не использую правильные термины; perl на самом деле не моя сильная сторона). Давайте изменим тестовый скрипт на perl и посмотрим на эффект, который имеют все эти эталонные вещи.
use Data::Dumper;
$Data::Dumper::Terse = 1;
$Data::Dumper::Indent = 0;
$x2 = 2;
my @x = (1,\$x2,3,4);
my @y = find_all_subsets(@x);
$x2 = 99;
foreach my $subset (@y) {
print Dumper($subset), "\n";
}
и вывод изменится на
[1]
[1,4]
[1,3]
[1,3,4]
[1,\99]
[1,\99,4]
[1,\99,3]
[1,\99,3,4]
[\99]
[\99,4]
[\99,3]
[\99,3,4]
[3]
[3,4]
[4]
Видите ли, я изменяю $ x2 после вызова функции find_all_subsets (), но все еще в результате используется новое значение, а Data :: Dumper помечает "значение" как ссылка (\ 99 вместо просто 99). Вам также нужна эта функция в вашем php-скрипте?