Преобразование массива в многомерный массив в PHP при отправке результата из Oracle - PullRequest
1 голос
/ 18 января 2012

Вот пример того, как должен выглядеть мой массив:

$library = array(
    'book' => array(
        array(
            'authorFirst' => 'Mark',
            'authorLast' => 'Twain',
            'title' => 'The Innocents Abroad'
        ),
        array(
            'authorFirst' => 'Charles',
            'authorLast' => 'Dickens',
            'title' => 'Oliver Twist'
        )
    )
);

Когда я получаю результаты из базы данных Oracle:

$row = oci_fetch_array($refcur, OCI_ASSOC+OCI_RETURN_NULLS);

Но когда я выполняю свой код, я получаю только одну строку. Например: <books><book></book><name></name></books>

Но я хочу, чтобы все строки отображались в xml.

EDIT: Это мой класс для преобразования массива в xml:

  public static function toXml($data, $rootNodeName = 'data', &$xml=null)
    {
        // turn off compatibility mode as simple xml throws a wobbly if you don't.
        if (ini_get('zend.ze1_compatibility_mode') == 1)
        {
            ini_set ('zend.ze1_compatibility_mode', 0);
        }

        if (is_null($xml))
        {
            $xml = simplexml_load_string("<".key($data)."/>");
        }

        // loop through the data passed in.
        foreach($data as $key => $value)
        {
            // if numeric key, assume array of rootNodeName elements
            if (is_numeric($key))
            {
                $key = $rootNodeName;
            }

            // delete any char not allowed in XML element names
            $key = preg_replace('/[^a-z0-9\-\_\.\:]/i', '', $key);

            // if there is another array found recrusively call this function
            if (is_array($value))
            {
                // create a new node unless this is an array of elements
                $node = ArrayToXML::isAssoc($value) ? $xml->addChild($key) : $xml;

                // recrusive call - pass $key as the new rootNodeName
                ArrayToXML::toXml($value, $key, $node);
            }
            else
            {
                // add single node.
                $value = htmlentities($value);
                $xml->addChild($key,$value);
            }

        }
        // pass back as string. or simple xml object if you want!
        return $xml->asXML();
    }

    // determine if a variable is an associative array
    public static function isAssoc( $array ) {
        return (is_array($array) && 0 !== count(array_diff_key($array, array_keys(array_keys($array)))));
    }
}
?>

Теперь с ответом ниже я попробовал проблему, я получаю следующий вывод: <book>...</book> теги после каждой строки .. затем я попробовал 3-мерный массив, теперь я получаю: <book><book>...</book></book> в нужном месте, но у меня есть 2 из них. Это строка, где я должен определить, кто является корнем в этом массиве, и именно поэтому я получаю этот вывод. Но не знаю, как это изменить: $xml = simplexml_load_string("<".key($data)."/>");

Спасибо.

1 Ответ

1 голос
/ 18 января 2012

oci_fetch_array() всегда будет возвращать одну строку, вам нужно вызывать ее, пока не останется больше строк для извлечения, чтобы получить их все:

while ($row = oci_fetch_array($refcur, OCI_ASSOC+OCI_RETURN_NULLS))
{
    $library['book'][] = $row;
}
...