【问题标题】:assigning to an associative array slice in php在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();

标签: php associative-array slice


【解决方案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 对问题的评论。

      【讨论】:

        猜你喜欢
        • 2014-08-09
        • 1970-01-01
        • 2020-12-04
        • 1970-01-01
        • 2021-07-06
        • 2017-03-06
        • 2018-07-30
        • 1970-01-01
        • 2015-05-28
        相关资源
        最近更新 更多