Как перебрать сложный ассоциативный массив? - PullRequest
0 голосов
/ 11 мая 2018

Я работаю со следующим массивом.

Array
(
[device_id] => 432552343242
[host_name] => computer
[serial_number] => 32525243
[manufacturer] => HP
[model] => ProLiant BL460c Gen9
[locations] => Array
    (
        [0] => Array
            (
                [name] => New York
            )

    )

[cpu_count] => 1
[core_count] => 6
[is_virtual] => 
[operating_system] => Array
    (
        [version] => 6.6 Santiago
        [product] => Array
            (
                [vendor] => Varied
                [description] => ProductAdapter for handling various Unix or 
Linux based Operating Systems (HP-UX, AIX, Solaris, Ubuntu, etc...)
                [name] => Unix Operating Systems
            )

        [name] => Linux Server
    )

[users] => mydomain.com/users
[applications] => mydomain.com/applications
[qualified_name] => Array
    (
        [0] => Array
            (
                [name_type] => UnixName
                [name] => cbc.com
            )

        [1] => Array
            (
                [name_type] => DNSFQDN
                [name] => abc.com
            )

        [2] => Array
            (
                [name_type] => DNSDomain
                [name] => bbc.com
            )

        [3] => Array
            (
                [name_type] => OriginalHostname
                [name] => cnn.com
            )

    )
)

Когда я пытаюсь перебрать массив, чтобы вставить его в базу данных, я получаю 13 записей.

Вот мой код.

$array = json_decode($result, true);
foreach($array as $key=>$value) {
$hostname = $array['locations'];

$stmt = $mysqli->prepare("INSERT INTO test (Hostname) VALUES (?)");
$stmt->bind_param("s", $hostname);
$stmt->execute();
$stmt->close();
}

Я знаю, почему его добавили 13 команд.Его цикл по каждому индексу в массиве и вставка имени хоста для каждого.Как я могу просто заставить его вставить его?Должен ли я создать заявление?Или foreach внутри foreach?Любая помощь будет оценена?Новичок здесь.

1 Ответ

0 голосов
/ 11 мая 2018

Вы зацикливаетесь столько раз, сколько индексов в вашем самом большом массиве, НО вы не используете $key и $value. Ваш код точно делает то, что вы сказали ему сделать:

  • для каждого значения -> 13 циклов
    • получить значение $array['location']
    • вставить его в базу данных
  • конец вашего foreach

Если вы просто хотите вставить $array['locations'], почему вы используете foreach? Вы вставляете только одно значение и знаете, что это индекс, поэтому вам не нужно использовать foreach

С foreach вы можете сделать:

$array = json_decode($result, true);
foreach($array as $key=>$value) {
    if ($key === "location")
    {
        //$hostname = $array['locations'];
        $hostname = $value;

        $stmt = $mysqli->prepare("INSERT INTO test (Hostname) VALUES (?)");
        $stmt->bind_param("s", $hostname);
        $stmt->execute();
        $stmt->close();
    }
}

Но в этом нет реальной необходимости.

Я бы еще написал так:

$array = json_decode($result, true);
$hostname = $array['location'];

$stmt = $mysqli->prepare("INSERT INTO test (Hostname) VALUES (?)");
$stmt->bind_param("s", $hostname);
$stmt->execute();
$stmt->close();

[EDIT]

Если вы хотите выполнить цикл для вставки различных элементов вашего массива, вы должны использовать переменные $key и $value.

$array = json_decode($result, true);
foreach($array as $key=>$value) {
    if ($key === "location")
    {
        $hostname = $value; //contains $array['location']

        $stmt = $mysqli->prepare("INSERT INTO test (Hostname) VALUES (?)");
        $stmt->bind_param("s", $hostname);
        $stmt->execute();
        $stmt->close();
    } else if ($key === 'device_id')
    {
        $devide_id= $value; //contains $array['device_id']

        $stmt = $mysqli->prepare("INSERT INTO test (DeviceId) VALUES (?)");
        $stmt->bind_param("s", $devide_id);
        $stmt->execute();
        $stmt->close();
    } else if ($key === 'device_id')
    {
        $devide_id= $value; //contains $array['device_id']

        $stmt = $mysqli->prepare("INSERT INTO test (DeviceId) VALUES (?)");
        $stmt->bind_param("s", $devide_id);
        $stmt->execute();
        $stmt->close();
    } else if ($key === 'device_id')
    {
        $devide_id= $value; //contains $array['device_id']

        $stmt = $mysqli->prepare("INSERT INTO test (DeviceId) VALUES (?)");
        $stmt->bind_param("s", $devide_id);
        $stmt->execute();
        $stmt->close();
    } else if ($key === 'device_id')
    {
        $devide_id= $value; //contains $array['device_id']

        $stmt = $mysqli->prepare("INSERT INTO test (DeviceId) VALUES (?)");
        $stmt->bind_param("s", $devide_id);
        $stmt->execute();
        $stmt->close();
    } else if ($key === '...')
    {
        //etc
    }
}

Но если вы точно знаете ключи ваших значений в вашем массиве, я бы сделал это примерно так:

$hostname  = $array['location'];
$devide_id = $array['device_id'];

$stmt = $mysqli->prepare("INSERT INTO test (Hostname) VALUES (?)");
$stmt->bind_param("s", $hostname);
$stmt->execute();

$stmt = $mysqli->prepare("INSERT INTO test (DeviceId) VALUES (?)");
$stmt->bind_param("s", $devide_id);
$stmt->execute();

$stmt->close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...