PHP 删除多维关联数组中的空"列"

  • 本文关键字:数组 删除 关联 PHP php arrays
  • 更新时间 :
  • 英文 :


目标:生成一个数组,该数组只包括那些带有数据的"列",即使可能存在"头"。

示例数据:

Array (
[HeaderRow] => Array (
[0] => Employee [1] => LaborHours [2] => 0.1 [3] => 0.25 [4] => 0.5 [5] => 0.8
)
[r0] => Array (
[0] => Joe [1] => 5 [2] => [3] => [4] => 50 [5] =>
) 
[r1] => Array (
[0] => Fred [1] => 5 [2] => 10 [3] => [4] => [5] =>
)
)

所需输出:

Array (
[HeaderRow] => Array (
[0] => Employee [1] => LaborHours [2] => 0.1 [4] => 0.5
)
[r0] => Array (
[0] => Joe [1] => 5 [2] => [4] => 50
) 
[r1] => Array (
[0] => Fred [1] => 5 [2] => 10 [4] =>
)
)

因此,在这个非常简单的例子中,HeaderRow总是有数据,但如果c0和c1都是空的(就像[3]和[5]的情况一样),那么我想删除。我尝试像在其他语言中那样使用for循环进行迭代,但这显然不适用于关联数组。然后我试着做一个转置,然后做两个foreach循环,但这也让我失败了。以下是我的for循环尝试示例:

尝试For循环

for ($j = 0; $j <= count(reset($array))-1; $j++) {
$empty = true;
for ($i = 1; $i <= count($array)-1; $i++) {
if(!empty($array[$i][$j])) {
$empty = false;
break;
}               
}
if ($empty === true)
{
for ($i = 0; $i <= count($array); $i++) {
unset($array[$i][$j]);
}
}
}       
return $array;

尝试转置:

$array = transpose($array);
foreach ($array as $row)
{
$empty = true;
foreach ($row as $value)
{
if (!empty($value))
{
$empty = false;
}
}
if ($empty) {
unset($array[$row]);
}
}
$array = transpose($array);
return $array;

function transpose($arr) {
$out = array();
foreach ($arr as $key => $subarr) {
foreach ($subarr as $subkey => $subvalue) {
$out[$subkey][$key] = $subvalue;
}
}
return $out;
}

我知道转置的一个并没有得到很好的充实,但我想展示一下这种尝试。

感谢您的真知灼见。

我们可以让它变得更简单。只需使用array_column获取所有列值。使用带有自定义回调的array_filter可以删除所有空字符串值。如果过滤后,数组的大小为0,则该关键字需要为所有关键字中的unset子阵列。

注意:回调中的arrow syntax是从PHP 7.4开始引入的

代码段:

<?php

$data = array (
'HeaderRow' => Array (
'0' => 'Employee','1' => 'LaborHours', '2' => 0.1, '3' => 0.25, '4' => 0.5, '5' => 0.8
),
'r0' => Array (
'0' => 'Joe', '1' => 5, '2' => '','3' => '', '4' => 50, '5' => ''
),
'r1' => Array (
'0' => 'Fred', '1' => 5,'2' => 10, '3' => '', '4' => '', '5' => ''
)
);

$cleanup_keys = [];
foreach(array_keys($data['HeaderRow']) as $column_key){
$column_values = array_column($data, $column_key);
array_shift($column_values); // removing header row value
$column_values = array_filter($column_values,fn($val) => strlen($val) != 0);
if(count($column_values) == 0) $cleanup_keys[] = $column_key;
}
foreach($data as &$row){
foreach($cleanup_keys as $ck){
unset($row[ $ck ]);
}
}
print_r($data);

据了解,我在这方面工作了一天,在发布后有了片刻的清晰。答案是我没有利用钥匙

function array_cleanup($array)
{
$array = transpose($array);     
foreach ($array as $key => $value)
{
$empty = true;
foreach ($value as $subkey => $subvalue)
{               
if ($subkey != "HeaderRow") {
if (!empty($subvalue))
{
$empty = false;
}
}
}
if ($empty) {
unset($array[$key]);
}
}
$array = transpose($array);
return $array;
}

相关内容

  • 没有找到相关文章

最新更新