Сравнивать и редактировать два табулированных файла с помощью PHP? - PullRequest
0 голосов
/ 03 января 2012

Я хочу сравнить два tabdelimeted файла.Я беру файлы и преобразую их в два массива со следующей структурой:

Массив 1

Array
    (
        [0] => Array
            (
                [name] => name1
                [qty] => 200
            )

        [1] => Array
            (
                [name] => name2
                [qty] => 9
            )

        [2] => Array
            (
                [name] => name3
                [qty] => 3
            )

        [3] => Array
            (
                [name] => name4
                [qty] => 1
            )
    )

Массив 2

Array
    (
        [0] => Array
            (
                [name] => name1
                [qty] => 180
            )

        [1] => Array
            (
                [name] => name2
                [qty] => 9
            )

    )

Как сравнить эти два массиваи где значение отличается, чтобы заменить значение в массиве 2 на массив значения 1.

1 Ответ

0 голосов
/ 03 января 2012

Самый простой способ сделать это - создать ассоциативный массив для второго набора данных вместо формата массива, который вы использовали выше. Поскольку кажется, что у вас есть только два «столбца», и это по сути отношения ключ / значение, это должно быть легко и просто.

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

 // first create an associative array from the second indexed array
 $secondAssoc = array();
 foreach ($secondArray as $row) {
   $secondAssoc[$row['name']] = $row['qty'];
 }
 /*
  $secondAssoc now looks like:
  Array
      (
          [name1] => 180
          [name2] => 9
      )
 */

 // Now loop the first array and update it
 foreach ($firstArray as $rowId => $row) {
   if (isset($secondAssoc[$row['name']]) && $secondAssoc[$row['name']] != $row['qty']) {
     $firstArray[$rowId]['qty'] = $secondAssoc[$row['name']];
   }
 }
 /*
  $firstArray now looks like this:
  Array
      (
          [0] => Array
              (
                  [name] => name1
                  [qty] => 180
              )
          [1] => Array
              (
                  [name] => name2
                  [qty] => 9
              )
          [2] => Array
              (
                  [name] => name3
                  [qty] => 3
              )
          [3] => Array
              (
                  [name] => name4
                  [qty] => 1
              )
      )
  */

Посмотри, как работает .

РЕДАКТИРОВАТЬ Вот версия, которая также создает массив $modifiedItems, который содержит только измененные элементы:

 // first create an associative array from the second indexed array
 $secondAssoc = array();
 foreach ($secondArray as $row) {
   $secondAssoc[$row['name']] = $row['qty'];
 }

 // Now loop the first array and update it
 $modifiedItems = array();
 foreach ($firstArray as $rowId => $row) {
   if (isset($secondAssoc[$row['name']]) && $secondAssoc[$row['name']] != $row['qty']) {
     $firstArray[$rowId]['qty'] = $secondAssoc[$row['name']];
     $modifiedItems[] = array('name'=>$row['name'],'qty'=>$secondAssoc[$row['name']]);
   }
 }

Посмотри, как работает .

...