Объединение двух ассоциативных массивов, где второй массив имеет больше ключей php? - PullRequest
0 голосов
/ 02 мая 2018

Я читал этот вопрос здесь, так как у меня похожая проблема:

Объединение двух многомерных ассоциативных массивов

У меня очень похожая проблема, когда я пытаюсь объединить 2 ассоциативных массива вместе, но они действуют в модели «родитель / потомок», где для каждого родительского массива может быть несколько дочерних массивов.

Часть, над которой я работаю, - это интеграция новой облачной системы EPOS с устаревшей системой ERP, для которой требуется вывод данных в определенном формате файлов. Для каждой транзакции требуется строка заголовка транзакции (TH), а затем вложенные строки для каждого элемента в транзакции EPOS (TO).

Каждый массив является результатом запроса Mysql для представлений, которые я написал, чтобы учесть более короткие запросы select во время выполнения. Я перебираю несколько циклов, чтобы собрать транзакционные данные и записать их в мою базу данных как отдельный процесс, который будет выполняться по расписанию.

В качестве примера массивов исходных данных приведены следующие (var_dump каждого):

Пример родительской записи:

array(1) 
{ [0]=> array(53) 
{ ["Identifier"]=> string(2) "TH" 
  ["Trans_ID"]=> string(9) "157976911" 
  ["Trans_Date_Time"]=> string(19) "2017-10-19 11:38:13" 
  ["Till_ID"]=> string(5) "30481" 
  ["TILL_NAME"]=> string(5) "Till1" 
  ["Cashier_Name"]=> string(12) "Cashier_Name" 
  ["Branch_Ref"]=> string(5) "16783" 
  ["Order_Number"]=> string(0) "" 
  ["Original_Invoice"]=> string(0) "" 
  ["Returns_Number"]=> string(0) "" 
  ["Obselete1"]=> string(0) "" 
  ["Obselete2"]=> string(0) "" 
  ["Obselete3"]=> string(0) "" 
  ["Obselete4"]=> string(0) "" 
  ["Obselete5"]=> string(0) "" 
  ["Obselete6"]=> string(0) "" 
  ["Obselete7"]=> string(0) "" 
  ["Obselete8"]=> string(0) "" 
  ["Trans_Type"]=> string(4) "till" 
  ["Trans_Status"]=> string(4) "sold" 
  ["Customer_ID"]=> NULL 
  ["Obselete9"]=> string(0) "" 
  ["Customer_Ref"]=> string(0) "" 
  ["Cust_Surname"]=> NULL 
  ["Cust_Forename"]=> NULL ["Title"]=> NULL 
  ["Cust_add1"]=> string(0) "" 
  ["Cust_add2"]=> string(0) "" 
  ["Cust_City"]=> string(0) "" 
  ["Cust_State"]=> string(0) "" 
  } 
}

И пример исходных дочерних записей [0]:

array(2) 
{ [0]=> array(30) 
{ ["tran_id"]=> string(9) "157976911" 
["row_head"]=> string(2) "TO" 
["sku"]=> string(0) "" 
["barcode"]=> string(0) "" 
["item_name"]=> string(12) "Merlot Large" 
["item_style"]=> string(21) "250ml glass of Merlot" 
["qty"]=> string(1) "1" 
}
}

Как указано выше, дочерние массивы предназначены для каждого продукта в транзакциях EPOS, поэтому может быть несколько дочерних массивов для одного родителя. Я включил идентификатор транзакции в дочерние (TO), массивы на данный момент, но это должно быть опущено в окончательном выводе.

В результате я немного изо всех сил пытаюсь придумать, как я могу вложить несколько строк TO в каждый соответствующий TH.

Таким образом, пример формата файла с разделителем трубы будет:

TH | 1 | х | хх | х | хх | х | х
К | 1 | х | ому | х | ому | х | х
К | 1 | х | ому | х | ому | х | х
TH | 2 | х | хх | х | хх | х | х
К | 2 | х | ому | х | ому | х | х

Все работает, чтобы написать файл на моем локальном компьютере, но застрял на этих массивах.

1 Ответ

0 голосов
/ 02 мая 2018

Если вы хотите, чтобы каждый дочерний элемент был назначен существующему родительскому массиву, вы можете циклически просмотреть каждый из них, добавить массив items к родительскому массиву и проверить соответствующие идентификаторы, которые будут добавлены к items массив. Таким образом, всегда будет items, но если совпадений нет, он будет пустым, что позволит вам запустить аналогичный цикл и для вашего вывода.

// load the child-items into your existing parent array
foreach ($parentArray as $key => $parent) {
    $parentArray[$key]['items'] = array();
    foreach($childArray as $child) {
        if ($parent['Trans_ID'] == $child['tran_id']) {
            $parentArray[$key]['items'][] = $child;
        }
    }
}

echo '<table>';
// loop through again for output 
foreach ($parentArray as $parent) {
    echo '<tr>';
    echo '<th>'.$parentArray['identifier'].'</th>';
    echo '<th>'.$parentArray['another-field'].'</th>';
    echo '<th>'.$parentArray['another-field'].'</th>';
    echo '</tr>';
    foreach ($parent['items'] as $item) {
        echo '<tr>';
        echo '<td>'.$item['sku'].'</td>';
        echo '<td>'.$item['another-field'].'</td>';
        echo '<td>'.$item['another-field'].'</td>';
        echo '</tr>';
    }
}
echo '</table>';

Возможно, это не совсем точное соответствие, и вы могли бы альтернативно использовать один вложенный цикл для вывода и пропустить объединяющуюся часть, но это позволит вам использовать массив позже, если это необходимо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...