【问题标题】:Unify Array For JSON Encode?为 JSON 编码统一数组?
【发布时间】:2013-05-26 17:18:33
【问题描述】:

我正在尝试对我返回的数组进行 json_encode,以便我可以将它放置在数据源的 jQuery 插件中。我的问题是我正在使用 PDO 来查询我的数据库以取回数组,但是在执行 print_r 时,我看到我从数据库中取回的每个名称都在它自己的数组中。我如何将所有这些结果放入一个数组中,这样当我执行 json_encode 时,所有这些结果都在一个 jQuery 插件的可读字符串中?

数据库查询 (PDO) -

$query = "
           SELECT name
FROM  `clients` 
    ";      
    try 
    {
        $stmt = $b3->prepare($query); 
        $stmt->execute(); 
    } 
    catch(PDOException $ex) 
    {  
        die("Failed to run query: " . $ex->getMessage()); 
    } 
    $players = $stmt->fetchAll();

执行时返回的数组示例(注意我有 8000 个被返回,所以我只会发布前 5 个左右

print_r($players);

 Array
( 

 [0] => Array
        (
            [name] => ! CBC.ZXR
    )

[1] => Array
    (
        [name] => ! marioxz
    )

[2] => Array
    (
        [name] => ! V v :]
    )

[3] => Array
    (
        [name] => !?!
    )

[4] => Array
    (
        [name] => !CU @ 1337
    )

所以或多或少,我将如何统一我的数组,以便当我这样做时

json_encode($players["name"]);

它将返回一个包含上述名称的 JSON 字符串。

编辑

当前代码,

$query = "
       SELECT name
FROM  `clients` 
";      
try 
{
    $stmt = $b3->prepare($query); 
    $stmt->execute(); 
} 
catch(PDOException $ex) 
{  
    die("Failed to run query: " . $ex->getMessage()); 
} 
$playerNames = $stmt->fetchAll(PDO::FETCH_COLUMN, 0);

json_encode($playerNames);
var_dump(json_last_error());

【问题讨论】:

  • json_encode 返回一个值,它不会转换它的参数。存储此值 ($playerNamesJson = json_encode($playerNames);) 和/或回显它。现在你只是把结果扔掉了。
  • @raina77ow 我已经这样做了,但对我来说这看起来不像是普通的 JSON 字符串。 gophobia.com/beta/ajaxSearch.php
  • 但它显然是。检查来源,而不是显示给您的页面。使用json validator检查其内容。
  • ... 作为旁注:您确定需要将整个结果集传输到前端吗?对于autocomplete 的需求,通常只返回一个小的子集(与模式匹配)。
  • 我正在使用 Bootstrap Typeahead,到目前为止,使用我们通过您的第一个评论获得的字符串,每当我输入一个键时,它会循环输入的键,然后当我输入超过一个键,它什么也不返回。我不确定如何调试这个......

标签: php mysql json pdo encode


【解决方案1】:

好吧,您可以在结果行数组上使用array_map 来创建名称数组,如下所示:

$player_names = array_map(function($p) { return $p['name']; }, $players);

【讨论】:

  • 检查这个demo,它确实 工作 - 除非您使用的是 PHP 5.2(在这种情况下应该显示错误,因为使用了匿名函数)。
【解决方案2】:
$players = array
(
    'name' => iterator_to_array(new RecursiveIteratorIterator(new RecursiveArrayIterator($players)), false),
);

Demo.


使用 PHP 5.5,您还拥有array_column()

【讨论】:

    【解决方案3】:

    如果您试图从数据库查询的第一列结果中获取单级数组,请考虑将 fetch 类型传递给您的 fetchAll 调用:

    $playerNames = $sth->fetchAll(PDO::FETCH_COLUMN, 0);
    

    这应该导致 $playerNames 成为您正在寻找的格式的数组,您可以将其传递给 json_encode 或任何其他您想要的。有关 fetch 选项的更多信息,您可以查看 php 文档 (http://php.net/manual/en/pdostatement.fetchall.php) 中的示例。

    【讨论】:

    • 当我执行 json_encode 时,它​​没有返回任何内容。 gophobia.com/beta/ajaxSearch.php 将显示我要返回的内容。这是一个相当大的数组。
    • @AlixAxel 警告:json_last_error() 需要 0 个参数,给定 1 个
    • 您对 json_encode 的调用是什么?听起来您正在做的事情可能存在问题,因为您现在已经以您想要的格式返回了数组。
    • @Necro.:我可以重复 PHP 所说的,但是...json_encode($players); var_dump(json_last_error());
    • 根据您的 cmets 和从您发布的链接返回的响应,看起来这个答案对您解决这个问题很有用。利用 stackoverflow 的最佳方法是将帮助您的答案标记为已接受,然后搜索有助于解决您遇到的下一个问题的现有问题。如果您找不到任何现有问题,那么您可以就该主题打开一个新问题。遵循这些最佳做法将更有可能回答您未来的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 2014-07-31
    • 1970-01-01
    相关资源
    最近更新 更多