使用相同键组合数组的最佳方法


Best way around combine_array with identical keys?

我使用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
)