我正在使用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_combine($ array1,$ array2),我会得到:
["name"]=>"Jake Doe"
["email"]=>""
["shoe size"]=>"10.5"
问题是,我显然更喜欢让电子邮件不被空白值覆盖。我能做的就是下面的功能。我正在寻找的只是第二眼。这有更好的方法吗?我讨厌我有两个嵌套的ifs,但我不确定我是如何让它变得更干净或者甚至是可能的。
//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;
}
答案 0 :(得分:0)
布拉赫。试图挽救这种反应,因为我的第一次明显错过了帖子的全部内容。
如果你只是担心那些空白值,那么我会说你可以先穿过阵列一次,然后清理'删除没有相应值的索引:
<?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
)
答案 1 :(得分:0)
我看到你的程序唯一的问题是每个数组中的键名不匹配
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;
}