【问题标题】:PHP Multidimensional Array Merge IssuePHP多维数组合并问题
【发布时间】:2016-08-22 09:12:43
【问题描述】:

我正在运行一个输出多维数组的查询,如下所示:-

Array
(
[0] => Array
    (
        [0] => Array
            (
                [id] => 772
                [display_name] => Test Company Ltd
                [profile_page] => partners/test-company
            )

    )

[1] => Array
    (
    )

[2] => Array
    (
        [0] => Array
            (
                [id] => 772
                [display_name] => Test Company Ltd
                [profile_page] => partners/test-company

            )

)

我正在尝试使数组看起来像这样,以便我们可以在我们的网站上循环遍历它:-

Array
(
[0] => Array
    (
        [id] => 772
        [display_name] => Test Company Ltd
        [profile_page] => partners/test-company
    )
)

这一切都是使用 PHP 使用 Symfony2 和 Doctrine2 生成的。我已经尝试了几种方法来使其正常工作,但我已经恢复到我的第一种方法,即:-

$companies = array();

foreach($postcodes as $key=>$value) {
    $conn = $em->getConnection();

    $query = $conn->prepare("SELECT a.id, a.display_name, a.profile_page, b.meta_data FROM companies a, `cms`.pages b WHERE b.slug = a.profile_page AND a.active = 1 AND a.postcode = ".$value."  ORDER BY a.display_name ASC");
    $execute = $query->execute();
    $companies[] = array_replace_recursive($query->fetchAll());
}

echo '<pre>'; print_r($companies); echo '</pre>';

die();

如果有人能告诉我如何解决这个问题,那就太好了。

【问题讨论】:

    标签: php arrays symfony multidimensional-array array-merge


    【解决方案1】:

    $query-&gt;fetchAll() 本身就是一个你需要的多维数组。

    只需替换以下行

    $companies[] = array_replace_recursive($query->fetchAll());
    

    $innCompnies=$query->fetchAll();
    foreach($innCompnies as $inComp) {
         $companies[]=$inComp;
    }
    

    它不起作用,因为您将多维数组推入另一个数组。我们真正需要做的就是将元素一个一个地推入主数组中。

    【讨论】:

    • 我试过这个,当我从 $companies 以及 array_replace_recursive 中删除方括号时,它显示一个空数组。当我放回方括号并删除 array_replace_recursive 时,我得到的答案与以前完全相同。
    • 嗨,Alok,那太好了,而且很有效。谢谢你。但是,由于两个值相似,我将如何合并它。
    • 您将需要跟踪您在foreach 中访问的 ID,如果之前未访问过该 ID,则仅插入数组。
    • 当然。星期一早上是吗?谢谢阿洛克。我会将其标记为已回答。再次感谢队友,我真的很感谢你的帮助。有时编码过多会影响你的判断力,哈哈!
    【解决方案2】:

    我建议您避免循环中的 SQL 查询。此外,您有潜在的 SQL 注入漏洞将邮政编码连接到您的查询。因此,可能的解决方案可能是将您的 foreach 循环替换为:

    $companies = $conn->fetchAll(
        "SELECT a.id, a.display_name, a.profile_page, b.meta_data FROM companies a, `cms`.pages b WHERE b.slug = a.profile_page AND a.active = 1 AND a.postcode IN :postcodes  ORDER BY a.display_name ASC",
        compact('postcodes')
    );
    

    【讨论】:

      【解决方案3】:

      你可以像这样变换多维数组。

      $new_companies = array();
      array_walk($companies, function($companie) use($companies, &$new_companies){
        if(is_array($companie)) {
          foreach ($companie as $c) {
              $new_companies[] = $c;
          }
        }
      });
      

      $new_companies 是你想要的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-24
        • 1970-01-01
        • 2014-10-31
        • 2013-03-08
        • 2011-01-07
        相关资源
        最近更新 更多