2015-02-25 4 views
0

Я использовал comb_array для обновления таблицы MySQL из файла CSV. Я думал, что все работает как чемпион, но, похоже, источник данных не удивительно. Существует несколько столбцов с тем же именем, и эти столбцы становятся ключами в массиве. Например, возьмем два массива:Лучший способ для comb_array с идентичными ключами?

array 1 
[0]=>"name" 
[1]=>"email" 
[2]=>"shoe size" 
[3]=>"email" 

array 2 
[0]=>"Jake Doe" 
[1]=>"[email protected]" 
[2]=>"10.5" 
[3]=>"" 

, если я должен был использовать array_combine ($ массив1 $ 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

что делать, если '$ array2 [ 3] 'не было пустым? какую ценность вы хотите? – chiliNUT

+0

Итак, каков желаемый результат? Как * сделать * вы хотите комбинировать значения, если есть дубликаты? – deceze

+0

Извините за задержку. Меня беспокоит только то, что значение перезаписывается пустой строкой. Когда оба значения заполняются, это одно и то же значение. Не спрашивайте, почему это так, я только работаю с данными, которые мне дали ... yay! – jonlink

ответ

0

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] => [email protected] 
    [shoesize] => 10.5 
) 

Edit: включить пустые значения (но по-прежнему не позволяют пробелы переопределить существующие значения), сначала получить уникальные ключи от $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] => [email protected] 
    [shoesize] => 10.5 
) 
+0

Только что сделал бы это комментарий, но я не смог показать свой примерный код и выводить его в достойном формате. Que sera, sera. – haliphax

+0

Вам не хватает точки вопроса: что делать, если в '$ a' есть дубликаты? – deceze

+0

Ах, действительно. Понимание чтения FTL. Второй «email» полностью убежал от меня. Я буду использовать этот оставшийся soapbox, чтобы сказать, что я согласен; ответа недостаточно. Если второе * значение * не было пустым, то какой из них * должен * выиграть? В противном случае, я бы сказал, просто сделайте себе одолжение и сначала пройдите по массивам, обрезая каждый индекс из того, что имеет пустое значение. – haliphax

0

Единственная проблема, которую я вижу с вашей программой, когда ключевые имена не совпадают в каждом массиве

array 1 
[0]=>"name" 
[1]=>"email" 
[2]=>"shoe size" 
[3]=>"email" 

array 2 
[0]=>"Jake Doe" 
[1]=>"[email protected]" 
[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; 
} 
+0

Спасибо за проверку. Это фактически не будет проблемой (или не должно), потому что массив 1 является первой строкой файла CSV. Если я не получаю неверный CSV, все должно быть в порядке. Любые мысли о том, как я могу это проверить? Возможно, я просто могу убедиться, что в массиве есть равное количество ключей, используя 'count()'. – jonlink

+0

Вы должны использовать функции current() и next() во втором массиве, поэтому вам не нужно заботиться о ключевых именах. – Adam

+0

Мне понравилось бы, если бы я мог это сделать. К сожалению, система, которая создает файл CSV, может иметь столбцы в любом порядке. Это зависит от пользователя, который генерирует CSV-файл. Поэтому я мог бы получить '[0] =>« имя »или просто так же, как' [0] => «Дата рождения». Насколько я могу понять, это единственный способ найти надежный способ поиска данных в массиве, который я создаю. – jonlink

Смежные вопросы