Example #1
0
 /**
  * Parse data of known type
  *
  * @param array $data
  * @param string $type
  * @param string|array $parentId
  * @return void
  * @see Parser::process()
  */
 public function parse(array $data, $type, $parentId = null)
 {
     if (!$this->analyzer->isAnalyzed($type) && (empty($this->analyzer->getRowsAnalyzed()[$type]) || $this->analyzer->getRowsAnalyzed()[$type] < count($data))) {
         // analyse instead of failing if the data is unknown!
         $this->log->log("debug", "Trying to parse an unknown data type '{$type}'. Trying on-the-fly analysis", ["data" => $data, "type" => $type, "parentId" => $parentId]);
         $this->analyzer->analyze($data, $type);
     }
     $parentId = $this->validateParentId($parentId);
     $csvFile = $this->createCsvFile($type, $parentId);
     $parentCols = array_fill_keys(array_keys($parentId), "string");
     foreach ($data as $row) {
         // in case of non-associative array of strings
         // prepare {"data": $value} objects for each row
         if (is_scalar($row) || is_null($row)) {
             $row = (object) [self::DATA_COLUMN => $row];
         } elseif ($this->analyzer->getNestedArrayAsJson() && is_array($row)) {
             $row = (object) [self::DATA_COLUMN => json_encode($row)];
         }
         // Add parentId to each row
         if (!empty($parentId)) {
             $row = (object) array_replace((array) $row, $parentId);
         }
         $csvRow = $this->parseRow($row, $type, $parentCols);
         $csvFile->writeRow($csvRow->getRow());
     }
 }
 public function testArrayOfNull()
 {
     $analyzer = new Analyzer($this->getLogger('analyzer', true));
     $analyzer->getStruct()->setAutoUpgradeToArray(true);
     $analyzer->analyze([(object) ['val' => ['stringArr'], 'obj' => [(object) ['key' => 'objValue']]], (object) ['val' => [null], 'obj' => [null]]], 's2null');
     $analyzer->analyze([(object) ['val' => ['stringArr'], 'obj' => [(object) ['key' => 'objValue']]], (object) ['val' => [null], 'obj' => [null]]], 'null2s');
     self::assertEquals(['s2null' => ['val' => 'arrayOfscalar', 'obj' => 'arrayOfobject'], 's2null.val' => ['data' => 'scalar'], 'null2s' => ['val' => 'arrayOfscalar', 'obj' => 'arrayOfobject'], 'null2s.val' => ['data' => 'scalar'], 's2null.obj' => ['key' => 'scalar'], 'null2s.obj' => ['key' => 'scalar']], $analyzer->getStruct()->getStruct());
 }