首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将@{$subset},[@ext_subset],[$last_item]放在PHP中?

如何将@{$subset},[@ext_subset],[$last_item]放在PHP中?
EN

Stack Overflow用户
提问于 2010-03-12 06:22:39
回答 5查看 207关注 0票数 1

我在将子例程从Perl转换为PHP时遇到了问题(我是Perl新手)。整个子例程如下:

代码语言:javascript
复制
sub find_all_subsets {
  if (1 == scalar (@_)) {return [@_]}
  else {
    my @all_subsets = () ;
    my $last_item = pop (@_) ;
    my @first_subsets = find_all_subsets (@_) ;
    foreach my $subset (@first_subsets) {
      push (@all_subsets, $subset) ;
      my @ext_subset = @{$subset} ;
      push (@ext_subset, $last_item) ;
      push (@all_subsets, [@ext_subset]) ;
    }
    push (@all_subsets, [$last_item]) ;
    return (@all_subsets) ;
  }
}

我的问题是我真的不太了解Perl语法,所以我在用PHP编写这些@{$subset}[@ext_subset][$last_item]时遇到了麻烦。

谢谢,如果这个问题很愚蠢,我很抱歉。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-03-12 15:23:05

当我跑的时候

代码语言:javascript
复制
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";
}

(+原始脚本)输出是

代码语言:javascript
复制
[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]

请注意输出中的,我们稍后再讨论它们。

代码语言:javascript
复制
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";
}

产生

代码语言:javascript
复制
(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)

到目前一切尚好。现在回到。Dumper之所以选择这个而不是(),是因为它不是一个数组,而是一个数组引用(如果我没有使用正确的术语,就直接告诉我吧;perl确实不是我的强项)。让我们更改perl测试脚本并查看所有这些引用内容所具有的效果。

代码语言:javascript
复制
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";
}

并将输出更改为

代码语言:javascript
复制
[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]

您看,我在调用find_all_subsets()之后更改了$x2,但在结果中仍然使用了新值,Data::Dumper将" value“标记为引用( \99而不是简单的99 )。你的php脚本中也需要这个功能吗?

票数 2
EN

Stack Overflow用户

发布于 2010-03-12 06:32:48

[]是一个数组引用运算符,用于将数组转换为数组引用

@{}是一个数组取消引用运算符,它将数组引用转换为数组

代码语言:javascript
复制
@a = (1,2,3);
$a = [ @a ];
@b = @{$a};       # now @b ==> (1,2,3)
票数 4
EN

Stack Overflow用户

发布于 2010-03-12 06:40:57

如下所示:

代码语言:javascript
复制
@{$subset}    # Return array reference as an ordinary array, not applicable in PHP.
[@ext_subset] # Turn an array into an array reference, not applicable in PHP.
[$last_item]  # Create an array with $last_item as the only element, equal to array($last_item) in PHP.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2429155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档