Создайте многомерный массив с php и pdo - PullRequest
0 голосов
/ 31 января 2019

Я хочу отредактировать скрипт, который я нашел в сети.is имеет жестко запрограммированный массив, подобный этому.

$servers = array(
    'Google Web Search' => array(
        'ip' => '',
        'port' => 80,
        'info' => 'Hosted by The Cloud',
        'purpose' => 'Web Search'
    ),
    'Example Down Host' => array(
        'ip' => 'example.com',
        'port' => 8091,
        'info' => 'ShittyWebHost3',
        'purpose' => 'No purpose'
    )
);

Результат:

array(2) {
  ["Google Web Search"]=>
  array(4) {
    ["ip"]=>
    string(0) ""
    ["port"]=>
    int(80)
    ["info"]=>
    string(19) "Hosted by The Cloud"
    ["purpose"]=>
    string(10) "Web Search"
  }
  ["Example Down Host"]=>
  array(4) {
    ["ip"]=>
    string(11) "example.com"
    ["port"]=>
    int(8091)
    ["info"]=>
    string(14) "ShittyWebHost3"
    ["purpose"]=>
    string(10) "No purpose"
  }
}

Я помещаю эти данные в базу данных и хочу создать тот же массив, но мне кажется, что он не работает

Это код, который я добавил для создания массива:

$query ="SELECT name, ip, port, hosting FROM sites";
$select = $conn->prepare($query);
$select->execute(array());
$testing = array();
while($rs = $select->fetch(PDO::FETCH_ASSOC)) {
    $testing[] = array($rs['name'] => array('ip'=> $rs['ip'], 'port'=> $rs['port'], 'hosting'=> $rs['hosting']));
}

В результате этого:

array(2) {
  [0]=>
  array(1) {
    ["Google Web Search"]=>
    array(3) {
      ["ip"]=>
      string(10) "google.com"
      ["port"]=>
      string(2) "80"
      ["hosting"]=>
      string(19) "Hosted by The Cloud"
    }
  }
  [1]=>
  array(1) {
    ["Example Down Host"]=>
    array(3) {
      ["ip"]=>
      string(11) "example.com"
      ["port"]=>
      string(2) "09"
      ["hosting"]=>
      string(14) "ShittyWebHost3"
    }
  }
}

есть способ сделать нижний массивтак же, как верхний массив, я не хочу редактировать весь скрипт, это кажется проще.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Когда вы присваиваете значение массиву, вы используете синтаксис $arr[key] = $value.Если вы опустите ключ во время назначения, $value будет назначен следующему доступному целочисленному ключу массива, начиная с 0. Это пример того, как он работает:

$arr = array();
$arr[] = 'one';//Empty, so insert at 0 [0=>'one']
$arr[] = 'two';//Last element at 0, so use 1 [0=>'one',1=>'two']
$arr[6]= 'three';//Key is used, so use key [0=>'one',1=>'two',6=>'three']
$arr[] = 'four';//Max used integer key is 6, so use 7
print_r($arr);//[0=>'one',1=>'two',6=>'three',7=>'four']

Итак, когдав вашем коде вы используете

$testing[] = array(
    $rs['name'] => array(
        'ip'=> $rs['ip'], 
        'port'=> $rs['port'], 
        'hosting'=> $rs['hosting']
    )
);

Вы присваиваете вновь созданный массив позициям 0,1,2, .. N.

Чтобы избежать этого, просто явно укажите ключИспользуя значение, которое вы действительно хотите, например,

$testing['name'] => array(
    'ip'=> $rs['ip'], 
    'port'=> $rs['port'], 
    'hosting'=> $rs['hosting']
);

Подробнее о массивах можно прочитать в документации

Примечание Если вы неНе говоря уже о наличии дополнительного столбца в сгенерированных массивах, вы можете полностью переписать свой код следующим образом:

$query ="SELECT name, ip, port, hosting FROM sites";
$results = $conn->query($query)->fetchAll(PDO::FETCH_ASSOC);
$testing = array_column($results,null,'name');

Это немного медленнее, но, на мой взгляд, очень удобно, PDOStatement::fetchAll извлекает все данные сразуи array_column с использованием null в качестве второго параметра переиндексирует массив с нужным столбцом в качестве ключа.

0 голосов
/ 31 января 2019

Вы добавляете новый индексированный целочисленный элемент с [], а затем добавляете 2 вложенных массива.Вместо этого добавьте имя в качестве ключа:

 $testing[$rs['name']] = array('ip'=> $rs['ip'],
                               'port'=> $rs['port'],
                               'hosting'=> $rs['hosting']);

Поскольку вы указываете столбцы в запросе, и они совпадают с ключами массива, то просто так:

 $testing[$rs['name']] = $rs;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...