/** * deBSON() -- private method * * MongoDB has a problem fetching data as it tends to BSON serialize all properties within a record for * non-packed record arrays. So, this method, which is recursive, takes the current data payload of N-records, * and traverses all the records looking for declared array fields (fieldTypes). * * When found, that field type is force-cast to type = array and, if the field itself is another array, such * as a sub-collection, the method will recursively call itself. * * As of this time, version 1.0.0, this method is only called from the _fetchRecords() method. * * @author mike@givingassistant.org * @version 1.0 * * @param $_data * * HISTORY: * ======== * 08-29-17 mks CORE-494: original coding * 11-26-18 mks DB-55: added error processing if a key is not a member of the current class * */ private function deBSON(&$_data) { if (is_array($_data) and array_key_exists(0, $_data)) { for ($index = 0, $limit = count($_data); $index < $limit; $index++) { foreach ($_data[$index] as $column => &$value) { if ($this->fieldTypes[$column] == DATA_TYPE_ARRAY) { if (!is_scalar($value)) { foreach ($value as &$rec) { if (!is_scalar($rec)) $rec = (array) $rec; } $this->deBSON($value); } $_data[$index][$column] = (array) $value; } } } } elseif (is_array($_data)) { foreach ($_data as $key => $val) { if (array_key_exists($key, $this->fieldTypes) and $this->fieldTypes[$key] == DATA_TYPE_ARRAY) { if (is_array($val)) $this->deBSON($val); $_data[$key] = (array) $val; } elseif (!array_key_exists($key, $this->fieldTypes)) { $msg = ERROR_DATA_FIELD_NOT_MEMBER . $key; $this->eventMessages[] = sprintf(STUB_LOC, basename(__FILE__),__METHOD__, __LINE__) . COLON . $msg; $this->logger->data($msg); } } } }