2016-07-18 2 views
0

Итак, я искал, но я не мог найти что-то похожее. Мне нужно слить 2 строки, которые я получил из БД (хранится в массиве), и заполнить пустые поля.Объедините 2 строки в одну заполняющую пустую поля

У нас есть 2 ключа FIXED и WEIGHT, и они имеют разные значения в столбцах. Если мы используем FIXED-тип, мы не используем значения из WEIGHT, и эти столбцы пустые, теперь я должен объединить эти 2 2rows в один.

Существует N строк (но всегда в паре).

Вот пример

id type postal fix_price weight_price our_price your_price product_id group_id 
1 fixed 8888 50  -   50  -   1   2 
2 weight 8888 -   100   -   100  1   2 
3 fixed 7777 20  -   20  -   1   2 
4 weight 7777 -   30   -   30   1   2 

И мне нужно привести, как показано ниже:

id postal fix_price weight_price our_price your_price product_id group_id 
1 8888 50  100   50  100  1   2 
2 7777 20   30   20  30   1   2 

Благодарим Вас за помощь!

+0

все, что вы пробовали до сих пор? должно быть довольно легко зацикливаться на результате ... – Jeff

+1

Попробуйте что-то вроде select postal, max (fix_price), max (weight_price), max (our_price), max (your_price) из таблицы по почтовому адресу –

+0

Rakesh Kumar - его чистая вещь php (Мне нужно объединить данные из 1 массива на основе ключа -> Тип = (фиксированный/вес), и эти два ключа всегда находятся в паре @Jeff Я попытался с $ arra1 + $ array2 (до того, как я сделал foreach цикл и сохранить в массиве 1 все строки с фиксированным типом и массив 2 с весом типа, а затем также попытались использовать array_filter ($ array1) + array_filter ($ array2) и comb_arrays, но это не то, что мне нужно thx для поддержки – JohnWayneX

ответ

0

Try:

$collect=array(); 
$useType='fixed'; 
foreach($array as $set){ 
    $check=$set['type']; 
    unset($set['type']); 
    if(!isset($collect[$set['postal']])) { 
     $collect[$set['postal']] = $set; 
    } else { 
     foreach($set as $k=>$v){ 
      if($k=='id' && $check!=$useType) { 
       continue; 
      } 
      if(!empty($v)){ 
       $collect[$set['postal']][$k] = $v; 
      } 
     } 
    } 
} 
$collect=array_values($collect); 
var_export($collect); 

Это дает свой expacted результат, но я не вещь, это то, что вы действительно хотите.

+0

Это не то, что я хочу на самом деле. Здесь вы можете увидеть на этой ссылке мою структуру данных http://www.sharecsv.com/s/2b84a6eaa2ed094c05de60ea547cffab/prices.csv Когда вы открываете этот файл из строки 2 в строку 30, это тип «weightand» и от 31 до 59, тип «fixed». Итак, я хочу заполнить колонки «Main» и «weight_pr» полями типа, зафиксированными в столбцах «Main» и «weight_pr», и в этом случае у меня есть только 28 строк со всеми данными (теперь его 58 строк) – JohnWayneX

0

Я действительно не понимаю, как ваш вопрос связан с (самой разной) структурой данных, которую вы поделили в своем комментарии в ответ на @JustOnUnderMillions, так что вот ответ, основанный на структуре, предложенной вашим первоначальным вопросом.

Воспользовавшись вашим друг комментариев, где вы говорите: «Я попытался с $ arra1 + $ array2» Я предполагаю, что вы в состоянии первого форматирования исходных данных, как это:

$fixed = [ 
    8888 => [50, NULL, 50, NULL, 1, 2], 
    7777 => [20, NULL, 20, NULL, 1, 2], 
]; 
$weight = [ 
    8888 => [NULL, 100, NULL, 100, 1, 2], 
    7777 => [NULL, 30, NULL, 30, 1, 2], 
]; 

Тогда это довольно легко использовать этот простой код:

foreach ($fixed AS $postal => $fixed_data) { 
    $weight_data = $weight[$postal]; 
    foreach ($fixed_data AS $key => $fixed_value) { 
    $all[$postal][$key] = $fixed_value ? $fixed_value : $weight_data[$key]; 
    } 
} 

который дает ожидаемый результат:

echo '<pre>' . print_r($all, TRUE) . '</pre>'; 
/* 
Array 
(
    [8888] => Array 
     (
      [0] => 50 
      [1] => 100 
      [2] => 50 
      [3] => 100 
      [4] => 1 
      [5] => 2 
     ) 

    [7777] => Array 
     (
      [0] => 20 
      [1] => 30 
      [2] => 20 
      [3] => 30 
      [4] => 1 
      [5] => 2 
     ) 

) 
*/ 
Смежные вопросы