【问题标题】:Reindex and fill out array depending on another array根据另一个数组重新索引并填写数组
【发布时间】:2011-05-17 13:38:32
【问题描述】:

我正在尝试使用来自两个数组的信息创建一个表。这是两个数组:

第一个数组,用于表头

Array
(
    [0] => Color
    [1] => Length
    [2] => Waist
)

第二个数组,需要修改的那个

Array
(
    [0] => Array
        [0] => green [1] => Color

    [1] => Array
        [0] => 23 [1] => Length
)
Array
(
    [0] => 
)
Array
(
    [0] => Array
        [0] => 23 [1] => Length

    [1] => Array
        [0] => 24 [1] => Waist 
)       

数组需要如下所示:

Array
(
    [0] => Array
        [0] => green [1] => Color

    [1] => Array
        [0] => 23 [1] => Length
    
    [2] => Array
        [0] => [1] => Waist 

Array
(
    [0] => Array
        [0] => [1] => Color

    [1] => Array
        [0] => [1] => Length

    [2] => Array
        [0] => [1] => Waist  

Array
(
    [0] => Array
        [0] => [1] => Color

    [1] => Array
        [0] => 23 [1] => Length

    [2] => Array
        [0] => 24 [1] => Waist 

所以重点是第一级的键需要与构成表头的数组中的键匹配,其中 [1] 一个第二级与表头具有相同的值。有什么想法吗?


经过一些反馈后,另一种可接受的输出数组结构将是:

array(
    array(
        'Color' => 'green',
        'Length' => 23,
        'Waist' => null
    ),
    array(
        'Color' => null,
        'Length' => null,
        'Waist' => null
    ),
    array(
        'Color' => null,
        'Length' => 23,
        'Waist' => 24
    )
)

【问题讨论】:

  • 很难找出你的问题。你必须重新格式化数组吗?您不能更改生成它们的脚本以提供正确格式的数组吗?
  • 数字键的顺序重要吗?
  • 为什么不改为Array ( [Color] => green, [Length] => 23, [Waist] => 24 )?恕我直言,这更合乎逻辑。我评论而不是回答,因为它没有回答你的问题。

标签: php arrays default-value


【解决方案1】:

对于一组简单的数据,您有一个复杂的数组结构。你的最终数组能像这样更好地工作吗?

$data = array(
    array(
        'Color' => 'green',
        'Length' => 23,
        'Waist' => NULL
    ),
    array(
        'Color' => NULL,
        'Length' => NULL,
        'Waist' => NULL
    ),
    array(
        'Color' => NULL,
        'Length' => 23,
        'Waist' => 24
    )
);

但是,如果您对自己的结构死心塌地,这应该可行:

function format_my_array($keys, $malformed) {
    foreach ($malformed as $key => $fragments) {
        $temp = array(
            'Color' => NULL,
            'Length' => NULL,
            'Waist' => NULL
        );
        foreach ($fragments as $fragment) {
            if (isset($fragment[1])) {
                switch($fragment[1]) {
                    case 'Length':
                        $temp['Length'] = $fragment[1];
                        break;
                    case 'Waist':
                        $temp['Waist'] = $fragment[1];
                        break;
                    default:
                        $temp['Color'] = $fragment[1];
                        break;
                }
            }
        }
        $malformed[$key] = array(
            array($temp['Color'], 'Color'),
            array($temp['Length'], 'Length'),
            array($temp['Waist'], 'Waist')
        );
    }
    return $malformed;
}

【讨论】:

  • 你说得对,我要编写生成数组的脚本。
  • 我想我会让你知道,当我查看代码并添加关联键时,我的脚本使用了比以前更简洁的代码。由于我对 php 很陌生,我完全忘记了键名的用处。所以,谢谢!
【解决方案2】:

将默认值(一次)生成为可重复使用的数组,然后迭代您的输入数据并用每个项目的“属性”集覆盖默认值。

代码:(Demo) (PHP7.4+ Demo)

$headers = ['Color', 'Length', 'Waist'];

$data = [
    [
        ['green', 'Color'],
        ['23', 'Length'],
    ],
    [],
    [
        ['23', 'Length'],
        ['24', 'Waist'],
    ],
];

$defaults = array_fill_keys($headers, null);
var_export(
    array_map(
        function($item) use($defaults) {
            return array_replace($defaults, array_column($item, 0, 1));
        },
        $data
    )
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 2012-02-11
    • 2020-09-01
    • 1970-01-01
    相关资源
    最近更新 更多