PHP:如何使所有阵列具有相同的密钥
问题描述:
当前,我尝试在网站中执行不同形状的信息。PHP:如何使所有阵列具有相同的密钥
最后的结果我需要是一个CSV文件。问题是具有不同页面形状的页面需要不同的字段。
比方说,报废后,我有以下阵列:
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',
),
)
那么,怎样才能让我这个数组如下所示吗?
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
key-1,key-2,key-3
value #1,value #2,value #3
,value #2,value #3
value #1,,value #3
,value #2,
答
全部溶液的一个可能的示例输出是:
// 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
}
答
<?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);
?>
测试结果
[[email protected] 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);
?>
输出
[[email protected] 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] =>
)
)
答
希望我简单的职位也将有所帮助。这里我们使用array_map
,array_keys
,array_merge_recursive
,array_diff
和splat
运营商。
$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);
你不需要值添加到阵列。写入csv时只需添加空值。 –
没有魔法。只需使用for循环。 'for($ x = 1; $ x
@u_mulder事情是我从一开始就不知道丢失的键。几乎每个我试图报废的产品都有不同的密钥。每种产品只有少数是相同的。 –