在php中分配给关联数组切片

Posted

技术标签:

【中文标题】在php中分配给关联数组切片【英文标题】:assigning to an associative array slice in php 【发布时间】:2010-12-21 16:08:39 【问题描述】:

在 perl 中,我可以将一个列表分配给哈希中的多个值,如下所示:

# define the hash...
my %hash = (
  foo => 1,
  bar => 2,
  baz => 3,
);

# change foo, bar, and baz to 4, 5, and 6 respectively
@hash 'foo', 'bar', 'baz'  = ( 4, 5, 6 );

有没有办法在 php 中做同样的事情?事实上,有没有办法获得一个 assoc 数组的切片?

【问题讨论】:

注意:我已经知道 list 并且问题的重点是找到比以下更优雅的解决方案: list ( $array['a'], $array['b'], $array['c'], $array['d'], $array['e'], $array['f'], $array['g'], $array['h'], $array ['i'], $array['j'], $array['k'], $array['l'], $array['m'] ) = some_function(); 【参考方案1】:

一个简单的单行(其中一些方法需要比询问时可用的新版本的 PHP):

$hash = array(
    'foo'=>1,
    'bar'=>2,
    'baz'=>3,
);

$hash = array_merge( $hash, array( 'foo' => 4, 'bar' => 4, 'baz' => 5 ) );

array_merge 的 PHP 手动输入。

如果你想获取一组特定的数组键,你可以使用这个:

$subset = array_intersect_key( $hash, array_fill_keys( array( 'foo', 'baz' ), '' ) );

array_intersect_key 的 PHP 手动条目和 array_fill_keys.

【讨论】:

【参考方案2】:

定义哈希:

$hash = array(
  'foo' => 1,
  'bar' => 2,
  'baz' => 3,
);

# change foo, bar, and baz to 4, 5, and 6 respectively
list($hash['foo'], $hash['bar'], $hash['baz']) = array( 4, 5, 6 );

# or change one by one
$hash['foo'] = 1;
$hash['bar'] = 2;
$hash['baz'] = 3;

查看手册中的 list() 函数:

http://php.net/manual/en/function.list.php

【讨论】:

list() 实际上是在相反的方向:它需要一个变量列表和一个数组,并将数组中的每个项目分配给相应的变量(即,这是一种从数组中取出东西的方法而不是一种把东西放进去的方式)。 你可以这样做 $info = array(4,5,6); list($a['foo'], $a['bar'], $a['baz']) = $info;但是使用“列表”确实没有给你买任何东西。 这种方法有效,但这正是我试图避免的。我不想为每个键键入 assoc 数组的名称。像 "assoc_array_slice( $array, 'foo','bar','baz') = array( 4, 5, 6 )" 这样的东西是我真正想要的。 是的,但是没有与PHP中给定示例等效的1对1,我尝试最接近。【参考方案3】:

没有等同于 Perl 语法的东西。但是您可以创建一个感兴趣的键数组,并使用它来仅更改数组的一部分。

$koi=array('foo', 'bar', 'baz' );
foreach($koi as $k)
  $myarr[$k]++; //or whatever

array_walk($myarr, create_function('&$v,$k','$v=(in_array($k,$koi))? $v*2 : $v;')); //you'd have to define $koi inside the function

【讨论】:

【参考方案4】:

简而言之,没有。但是,您可以使用这样的函数:

function assignSlice($ar,$keys,$args) 
  if (count($keys) !== count($args)) 
    // may want to handle more gracefully;
    // simply returns original if numbers of keys and values
    // don't match
    return $ar;
                                                   
  foreach ($keys as $index=>$key) 
    $ar[$key] = $args[$index];
  
  return $ar;


$test = array(
    'foo'=>1,
    'bar'=>2,
    'baz'=>3,
    );

$newtest = assignSlice($test,array('foo','bar'),array(4,5));

编辑:调整代码以响应 OP 对问题的评论。

【讨论】:

以上是关于在php中分配给关联数组切片的主要内容,如果未能解决你的问题,请参考以下文章

如何从数组中获取值并在zend框架工作中分配给视图

定义在PHP中分配给变量的类的值。

如何在Bash中重命名关联数组?

为啥在三元函数中分配给数组类型的表达式失败

Python相当于在Matlab中分配给一个数组(在for循环内)

php判断数组是关联数组还是数值数组