【问题标题】:PHP: Modify value of multidimensional array using foreachPHP:使用 foreach 修改多维数组的值
【发布时间】:2016-12-19 04:19:53
【问题描述】:

我有一个使用Yii2的项目,在我的项目中用户可以上传一个excel文件,系统读取数据并设置成一个新的二维数组,例如:

Example.xls

这是我在 Controller 中使用的代码:

 for ($row = 1; $row <= $highestRow; ++$row) {
            $rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE);
            if (!is_null($rowData[0][0])) {
                    foreach ($rowData as $key => $value) {
                        foreach ($value as $vKey => $vValue) {
                            $tempArrayData[] = $vKey . "_" . $vValue;
                        }
                }
                $arrayData[] = $tempArrayData;
            }
}
 echo '<pre>';
 print_r($arrayData);
 echo '</pre>';
 die();

我想在每个数组的值中添加"$key_" 作为两个第一个字符。 所以我使用 foreach 来做到这一点,我得到了这个结果

Array
(
  [0] => Array
      (
        [0] => 0_first_name
        [1] => 1_last_name
        [2] => 2_age
        [3] => 3_sex
      )
  [1] => Array
      (
        [0] => 0_first_name
        [1] => 1_last_name
        [2] => 2_age
        [3] => 3_sex
        [4] => 0_Archie
        [5] => 1_Will
        [6] => 2_21
        [7] => 3_Male
      )  
  [2] => Array
      (
        [0] => 0_first_name
        [1] => 1_last_name
        [2] => 2_age
        [3] => 3_sex
        [4] => 0_Archie
        [5] => 1_Will
        [6] => 2_21
        [7] => 3_Male
        [8] => 0_Vani
        [9] => 1_Priscillia
        [10] => 2_21
        [11] => 3_Female
      )
)

但这不是我所期望的,在上面的结果中,数组数组总是从 Excel 数据的第一列开始。实际上,我需要这样的结果:

Array
(
  [0] => Array
      (
        [0] => 0_first_name
        [1] => 1_last_name
        [2] => 2_age
        [3] => 3_sex
      )
  [1] => Array
      (
        [0] => 0_Archie
        [1] => 1_Will
        [2] => 2_21
        [3] => 3_Male
      )  
  [2] => Array
      (
        [0] => 0_Vani
        [1] => 1_Priscillia
        [2] => 2_21
        [3] => 3_Female
      )
)

这是我需要的示例结果,有人知道如何获得上述结果吗?或者我如何修改上面的代码,以便我可以得到预期的结果。谢谢。

已编辑

如果我在foreach ($rowData as $key =&gt; $value) { 中删除这个foreach ($value as $vKey =&gt; $vValue) {print_r($value),结果如下:

Array
(
[0] => first_name
[1] => last_name
[2] => age
[3] => sex
)
Array
(
[0] => Archie
[1] => Will
[2] => 21
[3] => Male
)  
Array
(
[0] => Vani
[1] => Priscillia
[2] => 21
[3] => Female
)

最终数组结果

Array
(
 [0] => Array
    (
     [0] => Array
        (
          [0] => 0_first_name
          [1] => 1_last_name
          [2] => 2_age
          [3] => 3_sex
        )
    )
)

 [1] => Array
    (
     [0] => Array
        (
          [0] => 0_Archie
          [1] => 1_Will
          [2] => 2_21
          [3] => 3_Male
        )  
    )

 [2] => Array
    (
     [0] => Array
        (
          [0] => 0_Vani
          [1] => 1_Priscillia
          [2] => 2_21
          [3] => 3_Female
        ) 
    )    
)

解决此案的最终代码:

 $arrayData = [];
for($row = 1; $row <= $highestRow; ++$row) {
  $rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE);

  $arrayData[] = array_map(function($values) {
if (!is_null($rowData[0][0])) {
    $tempArrayData = [];
    foreach($values as $key => $value) {
      $tempArrayData[] = $key . '_' . $value;
    }
    return $tempArrayData;
  }, $rowData);
    }
    }

更新

项目有更新需求,项目已成功创建结果如上Final Result。但是现在数组需要修改,预期的结果是这样的

Array
(
  [0] => Array
    (
     [0] => Array
        (
          [0] => 0_first_name
          [1] => 1_last_name
          [2] => 2_age
          [3] => 3_sex
        )
     )
  [1] => Array
    (
     [0] => Array
        (
          [0] => 0_Archie
          [1] => 1_Will
          [2] => 2_21
          [3] => 3_Male
        )  
    )
  [2] => Array
    (
     [0] => Array
        (
          [0] => 0_Vani
          [1] => 1_Priscillia
          [2] => 2_21
          [3] => 3_Female
        ) 
    )    
)

有人知道如何解决这个问题吗?谢谢

【问题讨论】:

  • 你能做到print_r($rowData) 并添加它,以便我们知道我们可以做什么吗?
  • 也许您需要删除此foreach ($value as $vKey =&gt; $vValue) { 并使用 print_r($value) 或 @Archibald 所说的检查 `foreach ($rowData as $key => $value) {' 中的内容。
  • @prateekkathal 如果我这样做print_r($rowData),它只会打印上传的 Excel 文件第一列的值。所以在这种情况下,它会打印出Array ( [0] =&gt; Array ( [0] =&gt; 0_first_name [1] =&gt; 1_last_name [2] =&gt; 2_age [3] =&gt; 3_sex ) )

标签: php arrays excel multidimensional-array foreach


【解决方案1】:

首先这样做

$rowData = [];

for($row = 1; $row <= $highestRow; ++$row) {
  $rowData[] = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE);
}

现在你的$rowData 应该等于

$rowData = [
  ["first_name", "last_name", "age", "sex"],
  ["Archie", "Will", "21", "Male"],
  ["Vani", "Priscillia", "21", "Female"]
];

您可以简单地尝试这样做

$arrayData[] = array_map(function($values) {
  $tempArrayData = [];
  foreach($values as $key => $value) {
    $tempArrayData[] = $key . '_' . $value;
  }
  return $tempArrayData;
}, $rowData);

最终代码

$arrayData = [];

for($row = 1; $row <= $highestRow; ++$row) {
  $rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE);

  $arrayData[][0] = array_map(function($values) {
    $tempArrayData = [];
    foreach($values as $key => $value) {
      $tempArrayData[] = $key . '_' . $value;
    }
    return $tempArrayData;
  }, $rowData);
}

最终输出

array:3 [▼
  0 => array:4 [▼
    0 => "0_first_name"
    1 => "1_last_name"
    2 => "2_age"
    3 => "3_sex"
  ]
  1 => array:4 [▼
    0 => "0_Archie"
    1 => "1_Will"
    2 => "2_21"
    3 => "3_Male"
  ]
  2 => array:4 [▼
    0 => "0_Vani"
    1 => "1_Priscillia"
    2 => "2_21"
    3 => "3_Female"
  ]
]

【讨论】:

  • 我不确定我的数组是否等于那个数组,但我确信这两个数组都具有相同的数组类型(二维数组)。我试过你的代码,但代码只从最后一列获取值。所以我得到的结果是`Array([0] => Array([0] => 0_Vani [1] => 1_Priscillia [2] => 2_21 [3] => 3_Female))
  • @Archibald 那么$rowData 等于什么?请编辑您的问题并粘贴数组。
  • 嗨@prateekkathal,我已经编辑了我的问题,我已经添加了数组,我认为我的数组和你的一样。
  • @Archibald 你检查我更新的答案了吗?它肯定可以工作....试试 Final Code 部分。
  • 是的,我现在正在尝试您的代码,但它在$tempArrayData[] = $key . '_' . $value; 中有 数组到字符串转换 错误
猜你喜欢
  • 1970-01-01
  • 2014-07-21
  • 2017-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-13
  • 2015-08-13
  • 2012-05-01
相关资源
最近更新 更多