【问题标题】:PHP array merge from unknown number of parametersPHP数组从未知数量的参数合并
【发布时间】:2011-07-19 13:04:28
【问题描述】:

我有一个如下所示的 PHP 数组:

$array['my_data']['value'] = 'some value';
$array['my_own_data']['value'] = 'another value';
$array['different_data']['value'] = 'another value';

我需要在 PHP 等中使用 array_merge。问题是第一级密钥的数量是未知的。可能是 150 件,我不知道。

这对我不起作用,因为密钥数量未知:

array_merge($array['my_data'], $array['my_own_data'], $array['different_data']);

我需要一个循环还是有什么花哨的东西?

【问题讨论】:

  • 你希望最终的数组是什么样子的?
  • 您是否知道array_merge($array['my_data'], $array['my_own_data'], $array['different_data']); 会生成一个包含$array['different_data']['value'] 的数组,因为array_merge 会用等键覆盖数组元素?
  • 你想做什么?您刚刚告诉您遇到了一些问题,但不是您需要从原始$array 中检索的内容?按键?第二把钥匙?价值观?

标签: php arrays array-merge


【解决方案1】:

如果这是你想要的,这可能会:

$array = array_map('current', $array);

或者可能

$array = array_map(function ($a) { return $a['value']; }, $array);

这应该给你

array('some value', 'another value', 'another value')

【讨论】:

    【解决方案2】:

    问题是第一级键的数量是未知的。可能是 150 件,我不知道。

    这是一个很容易解决的问题。

    如果想知道第一级的key个数:

    $numberOfKeysOfTheFirstLevel = count($array);
    

    你现在知道这个号码了。如果你真的需要他们的名字,你也可以这样做:

    $keyNamesOfTheFirstLevel = array_keys($array);
    

    那么你继续你的问题:

    由于未知数量的键,这对我不起作用: array_merge($array['my_data'], $array['my_own_data'], $array['different_data']);

    好消息是,您无需知道执行array_merge 操作的键数:

    call_user_func_array('array_merge', $array);
    

    所以关于你在问题中写的内容,这应该回答它。然而结果可能不是你所期望的。请同时查看其他答案并请询问

    【讨论】:

      【解决方案3】:

      请试试这个:

      $new_array = array();
      foreach($array as $item) {
        $new_array[] = $item['value'];
      };
      

      【讨论】:

        【解决方案4】:
        // 1. your array should have different keys, otherwise it will have no effect
        $array['my_data']['value1'] = 'some value';
        $array['my_own_data']['value2'] = 'another value';
        $array['different_data']['value3'] = 'another value';
        
        $result = call_user_func_array('array_merge', $array);
        

        将返回

        array(
          'value1' => 'some value', 
          'value2' => 'another value', 
          'value3' => 'another value', 
        )
        

        否则,你想要这样的东西吗?

        array(
          'value' => array('some value', 'another value', 'another value')
        )
        

        那你就可以了

        $array['my_data']['value'] = 'some value';
        $array['my_own_data']['value'] = 'another value';
        $array['different_data']['value'] = 'another value';
        
        $result = array();
        // PHP <= 5.2
        array_walk($array, create_function('&$item, $key, &$dest', '
            foreach ((array) $item as $subKey => $value) {
                if (!isset($dest[$subKey])) { $dest[$subKey] = array(); }
                $dest[$subKey][] = $value;
            }
        '), & $result);
        var_export($result);
        

        【讨论】:

          【解决方案5】:

          如果我明白你想要什么,你可以使用array_map

          改变:

          $a = array();
          $a['x']['value'] = 1;
          $a['y']['value'] = 3;
          $a['z']['value'] = 3;
          

          进入:

          array(3) {
           ["x"]=>
           int(1)
           ["y"]=>
           int(2)
           ["z"]=>
           int(3)
          }
          

          你可以定义一个函数:

          function f($x) { return $x['value'];}
          

          并使用array_map:

          $b = array_map(f, $a);
          

          【讨论】:

            【解决方案6】:
            array_map(function($a){
                return $a['value'];
            },$array);
            

            对于 php5.2 及更早版本:

            function stuff($a){
                return $a['value'];
            }
            array_map('stuff',$array);
            

            【讨论】:

              猜你喜欢
              • 2021-12-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-09-20
              • 2021-06-19
              相关资源
              最近更新 更多