首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP:如何使所有数组具有相同的键

PHP:如何使所有数组具有相同的键
EN

Stack Overflow用户
提问于 2017-08-30 07:06:39
回答 3查看 65关注 0票数 0

目前,我试图在一个带有不同形状信息的网站中执行报废操作。

最后的结果,我需要一个CSV文件。问题是具有不同页面形状的页面需要不同的字段。

比方说,在报废之后,我有以下数组:

代码语言:javascript
复制
Array
(
    [0] => Array(
        'key-1' => 'value #1',
        'key-2' => 'value #2',
        'key-3' => 'value #3',
    ),
    [2] => Array(
        'key-2' => 'value #2',
        'key-3' => 'value #3',
    ),
    [3] => Array(
        'key-1' => 'value #1',
        'key-3' => 'value #3',
    ),
    [4] => Array(
        'key-2' => 'value #2',
    ),
)

那么,如何使这个数组看起来像下面的数组呢?

代码语言:javascript
复制
Array
(
    [0] => Array(
        'key-1' => 'value #1',
        'key-2' => 'value #2',
        'key-3' => 'value #3',
    ),
    [2] => Array(
        'key-1' =>
        'key-2' => 'value #2',
        'key-3' => 'value #3',
    ),
    [3] => Array(
        'key-1' => 'value #1',
        'key-2' =>
        'key-3' => 'value #3',
    ),
    [4] => Array(
        'key-1' =>
        'key-2' => 'value #2'
        'key-3' =>
    ),
)

有什么办法吗?请记住,每个表都有大约20个键,而最后一个数组将有大约2000项。

实际上,我正在寻找最佳的性能解决方案,以避免我的计算机崩溃时,它试图处理的数据。

更新#1:从一开始就不知道缺少的键。几乎每个产品都有不同的领域,对于每个可用的产品,只有少数产品是相同的。

更新#2: --这是CSV的一个可能的示例输出

代码语言:javascript
复制
key-1,key-2,key-3
value #1,value #2,value #3
,value #2,value #3
value #1,,value #3
,value #2,
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-30 07:17:42

全面解决办法是:

代码语言:javascript
复制
// your source array
$a = Array
(
    Array(
        'key-1' => 'value #1',
        'key-2' => 'value #2',
        'key-3' => 'value #3',
    ),
    Array(
        'key-2' => 'value #2',
        'key-3' => 'value #3',
    ),
    Array(
        'key-1' => 'value #1',
        'key-3' => 'value #3',
    ),
    Array(
        'key-2' => 'value #2',
    ),
);

// storage for keys
$keys = [];

foreach ($a as $row) {
    // keys of current row
    $current_keys = array_keys($row);
    // find keys that are not already in a `$keys`
    $diff = array_diff($current_keys, $keys);

    // if keys found - add them to `$keys`
    if ($diff) {
        $keys = array_merge($keys, $diff);
    }

}

echo'<pre>',print_r($keys),'</pre>';    // check values of keys

foreach ($a as $row) {
    $rowForCsv = [];
    // check what keys exist in current `$row`
    foreach ($keys as $key) {
        $rowForCsv[$key] = !empty($row[$key]) ? $row[$key] : '';
    }
    // add `$rowForCsv` to CSV file
}
票数 2
EN

Stack Overflow用户

发布于 2017-08-30 07:17:56

代码语言:javascript
复制
<?php
   $first_element = array_keys( $array[0] );
   foreach($array as &$item)
   {
            foreach($first_element as $key)
            {
                     if(!array_key_exists($key, $item))
                     {
                              $item[$key]='';
                     }
            }
            ksort($item);
   }
   unset($item);
   print_r($array);
?>

测试结果

代码语言:javascript
复制
[akshay@localhost tmp]$ cat test.php
<?php


$array = array
(
    array(
        'key-1' => 'value #1',
        'key-2' => 'value #2',
        'key-3' => 'value #3',
    ),
    array(
        'key-2' => 'value #2',
        'key-3' => 'value #3',
    ),
    array(
        'key-1' => 'value #1',
        'key-3' => 'value #3',
    ),
    array(
        'key-2' => 'value #2',
    ),
);

   $first_element = array_keys( $array[0] );
   foreach($array as &$item)
   {
            foreach($first_element as $key)
            {
                     if(!array_key_exists($key, $item))
                     {
                              $item[$key]='';
                     }
            }
        ksort($item);
   }
   unset($item);
   print_r($array);

?>

输出

代码语言:javascript
复制
[akshay@localhost tmp]$ php test.php

Array
(
    [0] => Array
        (
            [key-1] => value #1
            [key-2] => value #2
            [key-3] => value #3
        )

    [1] => Array
        (
            [key-1] => 
            [key-2] => value #2
            [key-3] => value #3
        )

    [2] => Array
        (
            [key-1] => value #1
            [key-2] => 
            [key-3] => value #3
        )

    [3] => Array
        (
            [key-1] => 
            [key-2] => value #2
            [key-3] => 
        )

)
票数 1
EN

Stack Overflow用户

发布于 2017-08-30 07:34:40

希望我最简单的帖子也能有所帮助。这里我们使用array_maparray_keysarray_merge_recursivearray_diffsplat运算符。

Try this code snippet here

代码语言:javascript
复制
$allKeys=  array_map('array_keys', $array);//getting all keys of complete array
$result=array_unique(array_merge_recursive(...$allKeys));//getting unique keys
foreach ($array as $key => &$value){
    $data=array_diff($result, array_keys($value));//remaining keys
    if(count($data)!=0)
    {
        $newData=array();
        foreach($result as $key => $resultValue)
        {
            $newData[$resultValue]=isset($value[$resultValue]) ? $value[$resultValue] : "";
        }
        $value=$newData;//filled new data with absent keys
    }
}
print_r($array);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45954086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档