我使用combine_array从CSV文件更新MySQL表。我以为一切都像冠军一样工作,但事实证明数据源并不惊人。有多个列具有相同的名称,这些列将成为数组中的键。以两个阵列为例:
array 1
[0]=>"name"
[1]=>"email"
[2]=>"shoe size"
[3]=>"email"
array 2
[0]=>"Jake Doe"
[1]=>"jake@example.mail"
[2]=>"10.5"
[3]=>""
如果我使用array_command($array1,$array2),我会得到:
["name"]=>"Jake Doe"
["email"]=>""
["shoe size"]=>"10.5"
问题是,我显然更希望电子邮件不被空白值覆盖。我能想到的是下面的函数。我要找的只是第二双眼睛。有更好的方法吗?我讨厌我有两个嵌套的if,但我不确定我该如何让它更干净,或者这是否可能。
//array_combine simply overwrites repeat keys, this only overwrites if the value is empty
//if the first instance of the key has a value, it ignores duplicate keys
function new_array_combine($key_array,$value_array){
foreach($value_array as $key=>$value){
if(array_key_exists($key_array[$key],$new_array)){
if(empty($new_array[$key_array[$key]]))$new_array[$key_array[$key]]=$value;
}else{
$new_array[$key_array[$key]]=$value;
}
}
return $new_array;
}
我在程序中看到的唯一问题是每个数组中的键名不匹配
array 1
[0]=>"name"
[1]=>"email"
[2]=>"shoe size"
[3]=>"email"
array 2
[0]=>"Jake Doe"
[1]=>"jake@example.mail"
[3]=>"10.5"
[4]=>""
建议修改:
function new_array_combine($a1, $a2){
$result=Array();
reset($a1);
foreach($a2 as &$v){
$key=current($a1);
if (!isset($result[$key])||empty($result[$key]))
$result[$key]=$v;
next($a1);
}
return $result;
}
Blah。试图挽救这种回应,因为我的第一个显然没有抓住帖子的全部要点。
如果你只担心那些空白值,那么我想说你可以先遍历数组一次,通过删除没有相应值的索引来"清理"它们:
<?php
// $a and $b as defined in the example
foreach($a as $k => $v) {
if(empty($b[$k])) {
unset($a[$k]);
unset($b[$k]);
}
}
$c = array_combine($a, $b);
print_r($c);
输出:
Array(
[name] => Jake Doe
[email] => jake@example.mail
[shoesize] => 10.5
)
编辑:要包含空白值(但仍不让空白覆盖现有值),请首先从$a
中获取唯一键并使用它来构建一个空结果数组,然后在循环通过时跳过空白值。。。
<?php
// $a and $b as defined in the example
$result = array();
$keys = array_unique($a);
foreach($keys as $key) $result[$key] = '';
foreach($a as $k => $v) {
if(empty($b[$k])) continue;
$result[$v] = $b[$k];
}
print_r($result);
输出:
Array(
[name] => Jake Doe
[email] => jake@example.mail
[shoesize] => 10.5
)