Как создать многомерный массив при использовании подготовленных операторов? - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть запрос, который возвращает данные следующим образом:

releaseid | name | format |
---------------------------
1         | erbr | CD
1         | erbr | DVD
2         | name | CD
3         | test | CD
4         | yo   | CD
4         | yo   | CASETE
5         | hey  | 8 TRACK

Обратите внимание, что некоторые releaseid имеют более одного формата.

В PHP я использую подготовленный операторчтобы инициализировать массив следующим образом:

$conn = fn_connect(); // my function to connect to db
$q = 'SELECT ....';
$stmt = $conn->prepare($q);
$stmt->bind_param('i', $recordingid);
$stmt->execute();
$stmt->bind_result($id, $name, $format);
$stmt->store_result();
$num_rows = $stmt->num_rows;

if ( $num_rows > 0 ) {
    $releases = array();

    while ( $stmt->fetch() ) {
        $releases[$id] = array('releaseid'=>$id, 'releasename'=>$name, 'releaseformat'=>$format);
    }
}

$stmt->free_result();
$stmt->close();

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

Array
(
    [1] => Array
        (
            [releaseid] => 1
            [releasename] => erbr
            [releaseformat] => DVD
        )

    [2] => Array
        (
            [releaseid] => 2
            [releasename] => name
            [releaseformat] => CD
        )
...
)

Я пытаюсь создать многомерный массив, чтобы я мог сохранить все форматы releaseid

Я пытался использовать следующее, но опять же, он сохраняет последний формат

while ( $stmt->fetch() ) {
        $releases[$id] = array('releaseid'=>$id, 'releasename'=>$name, array('format'=>$format));
    }

Ответы [ 2 ]

2 голосов
/ 09 апреля 2019

Необходимо проверить, существует ли уже запись $id в $releases, и если это так, объединить новое значение формата с существующими значениями releaseformat. Примерно так:

while ( $stmt->fetch() ) {
    if (isset($releases[$id])) {
        $releases[$id]['releaseformat'][] = $format;
    }
    else {
        $releases[$id] = array('releaseid'=>$id, 'releasename'=>$name, 'releaseformat'=>array($format));
    }
}

Это даст вам значения, которые выглядят следующим образом:

[1] => Array
    (
        [releaseid] => 1
        [releasename] => erbr
        [releaseformat] => Array 
            (
                 [0] => CD
                 [1] => DVD
            )
    )
1 голос
/ 09 апреля 2019

Попробуйте это:

        $conn = new mysqli("host", "user", "pwd", "db");

        $q = 'SELECT ....';
        $stmt = $conn->prepare($q);
        $stmt->execute();
        $stmt_result = $stmt->get_result();
        $result = [];
        if ($stmt_result->num_rows > 0) {

            # Save in $row_data[] all columns of query
            while ($row_data = $stmt_result->fetch_assoc()) {

                if (isset($result[$row_data['id']])) {
                    $result[$row_data['id']]['releaseformat'][] = $row_data['format'];
                } else {
                    # Action to do
                    $result[$row_data['id']] = array('releaseid' => $row_data['id'], 'releasename' => $row_data['name'], 'releaseformat' => array($row_data['format']));
                }
            }

        } else {
            # No data actions
            echo 'No data here :(';
        }
        echo "<pre>";
        print_r($result);
        $stmt->close();

Это работает для меня, я надеюсь, что это будет работать для вас.

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