结合阵列和相同键的最佳方法?

时间:2015-02-25 04:18:10

标签: php

我正在使用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;
}

2 个答案:

答案 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;
}