【问题标题】:Make multidimensional array with php and pdo用php和pdo制作多维数组
【发布时间】:2019-01-30 21:59:03
【问题描述】:

我想编辑我在网上找到的脚本。 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"
    }
  }
}

有没有办法让底部数组和顶部数组一样,我不想编辑整个脚本,这似乎更容易。

【问题讨论】:

    标签: php arrays database pdo


    【解决方案1】:

    您正在使用 [] 附加一个新的整数索引元素,然后添加 2 个嵌套数组。相反,添加名称作为键:

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

    由于您在查询中指定了列并且它们与数组键相同,因此只需这样:

     $testing[$rs['name']] = $rs;
    

    【讨论】:

      【解决方案2】:

      为数组赋值时,使用语法$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']
      );
      

      您可以在documentation 中阅读有关数组的更多信息

      旁注 如果您不介意在生成的数组中有一个额外的列,您可以通过这种方式完全重写您的代码:

      $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 作为第二个参数确实以所需列作为键重新索引数组。

      【讨论】:

      • 非常感谢!我用过数据库解决方案,看起来更简单,代码更少!
      • 为什么要投反对票?不要抱怨,只是为了增强答案,如果可能的话......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-14
      • 2014-09-12
      • 1970-01-01
      • 1970-01-01
      • 2014-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多