【问题标题】:Merge two arrays with unequal values into key value pair将两个值不相等的数组合并成键值对
【发布时间】:2016-04-23 07:23:45
【问题描述】:

我有两个基本上是 HTML 表格数据的数组。我想将它们合并为一个。其中一个数组$headers 总是比第二个数组$data 小。

例如:

$headers = array("Name","Phone","E-Mail");
$data = array("Bob", "Phone1", "E-Mail1", "Mike", "Phone2", "Email2", "Jim",  "Phone3", "E-Mail3");

我想要的是以某种方式遍历这两个数组并将它们合并为一个键值对以结束:

$values[1][Name]       = "Bob";
$values[1][Phone]      = "Phone1";
$values[1][E-Mail]     = "E-Mail1";
$values[2][Name]       = "Mike";
$values[2][Phone]      = "Phone2";
$values[2][E-Mail]     = "E-Mail2";
$values[3][Name]       = "Jim";
$values[3][Phone]      = "Phone3";
$values[3][E-Mail]     = "E-Mail3";

基本上,将它们拆分成一个多维数组,按表的行排序。

现在,以不同方式存储我的数据不是一种选择。我的问题是如何将它提取到这个新数组中。

【问题讨论】:

  • array_combine 要求数组中的值数量相等。我现在正在查看array_chunk - 会尽快回复您...
  • 索引真的从 1 而不是 0 开始?
  • @Don'tPanic 没有。错字。无论如何,我删除了它,这个问题不需要。
  • 我认为您不希望在每个作业中都使用[]

标签: php arrays


【解决方案1】:

您可以通过一些数学运算来设置正确的键。

foreach ($data as $key => $value) {
    $values[(int) $key / 3][$headers[$key % 3]] = $value;
}

【讨论】:

    【解决方案2】:

    您可以结合使用 array_chunkarray_maparray_combine

    $headers = array("Name","Phone","E-Mail");
    $data = array("Bob", "Phone1", "E-Mail1", "Mike", "Phone2", "Email2", "Jim",  "Phone3", "E-Mail3");
    
    $result = array_map( function ( $chunk ) use ( $headers ) { 
      return array_combine( $headers, $chunk );
    }, array_chunk( $data, count( $headers ) ) );
    

    结果:

    Array 
    ( 
        [0] => Array 
            ( 
                [Name] => Bob 
                [Phone] => Phone1 
                [E-Mail] => E-Mail1 
            ) 
    
        [1] => Array 
            ( 
                [Name] => Mike 
                [Phone] => Phone2 
                [E-Mail] => Email2 
            ) 
    
        [2] => Array 
            ( 
                [Name] => Jim 
                [Phone] => Phone3 
                [E-Mail] => E-Mail3 
            ) 
    
    ) 
    

    【讨论】:

      【解决方案3】:

      我就是这样解决的,只使用array_chunks

      $values = array_chunk($data, count($headers));
      

      这几乎产生了我想要的,除了键是来自 headers 数组的索引,而不是 header 本身。由于我仍然引用了 headers 数组,所以当我想循环时,我这样做了:

      当我想在数组中使用这些值时,我是这样提取的:

      foreach ($values[$key] as $key => $value)
      {
            $value; // the data
            $headers[$key]; // the header (String, not index)
      }
      

      【讨论】:

        猜你喜欢
        • 2018-09-02
        • 1970-01-01
        • 2013-12-31
        • 2010-09-14
        • 2015-06-12
        • 2019-12-03
        • 2014-11-24
        相关资源
        最近更新 更多