【问题标题】:foreach, JSON & PHPforeach、JSON 和 PHP
【发布时间】:2013-02-07 03:29:18
【问题描述】:

我查看了各种答案,我假设这是由于缺少 foreach 循环,我只收到一个变量。共有 32 个类别,每个类别有多个链接。

表结构

CREATE TABLE `cattb` (
  `catNo` int(11) NOT NULL,
  `catName` varchar(100) NOT NULL,
  PRIMARY KEY  (`catNo`)
) 

CREATE TABLE `linktb` (
  `catId` int(11) NOT NULL,
  `URL` varchar(255) NOT NULL,
  `title` varchar(50) NOT NULL,
  `description` longtext NOT NULL,
  KEY `catId` (`catId`)
)

SQL 查询

SELECT catId, catName, URL, title, description FROM linktb, cattb WHERE linktb.catId=cattb.catNo

PHP

while ($row = mysql_fetch_assoc($result)){ 
    $json['categories'][] = array( 
        "catId"=> $row[catId],
        "catName"=> $row[catName],
        'links' => array( 
            "URL"=> $row[URL],
            "title"=> $row[title],
            "description"=> $row[description]
        )
    );

回应:

"categories":[
    {"catId":"1",
    "catName":"Career Resources",
    "links":
        {"URL":"http:\/\/www.designanddesign.com\/jobs.php",
        "title":"Design & Design",
        "description":"World-Wide Job Offers"
        }
    },
    {"catId":"1",
    "catName":"Career Resources",
    "links":
        {"URL":"https:\/\/www.nuans.com\/rts-str\/en\/home-accueil_en.cgi",
        "title":"NUANS Report",
        "description":"Naming A Company (Federal)"
        }
    }

我想看到的:

{   categories: [
    {   catName: "Career Resources",
        catId: "1",
        links: [
            {URL:"http://www.designanddesign.com/jobs.php",title:"Design & Design",description:"World-Wide Job Offers"},
            {URL:"https://www.ic.gc.ca/app/scr/cc/CorporationsCanada/hm.html?locale=en_CA",title:"Corporations Canada",description:"Incorporating a Business"},
            {URL:"http://lea.verou.me/css3patterns/",title:"CSS3 Patterns",description:"Patterns to use for backgrounds"},
            {URL:"http://webdesignerwall.com/tutorials/cross-browser-css-gradient",title:"CSS Gradients",description:"Cross-browser Compatible"}
            ],
    },
    {   catName: "CSS",
        catId: "2",
        links: [
            {URL:"http://www.designanddesign.com/jobs.php",title:"Design & Design",description:"World-Wide Job Offers"},
            {URL:"https://www.ic.gc.ca/app/scr/cc/CorporationsCanada/hm.html?locale=en_CA",title:"Corporations Canada",description:"Incorporating a Business"},
            {URL:"http://lea.verou.me/css3patterns/",title:"CSS3 Patterns",description:"Patterns to use for backgrounds"},
            {URL:"http://webdesignerwall.com/tutorials/cross-browser-css-gradient",title:"CSS Gradients",description:"Cross-browser Compatible"}
            ],
    }

如何为数组编写 for-each 循环?

【问题讨论】:

  • 使用您的代码,links 不会有多个条目,而只有一个。没有像您上面指定的那样循环生成该列表。
  • 尽管您没有任何提要数据,但您希望如何显示链接数组!看看@phazorRise 输入了什么
  • 所以我没有办法让我的链接用我的数据创建第二个数组?
  • 如果你想在每个项目中创建一个链接列表,你必须在链接数组中进行循环,除非你将它们存储在数据库的同一字段中,否则这是无法实现的,因为 $ row[URL] 只有 1 个 URL,没有多个 URL。

标签: php foreach getjson


【解决方案1】:

在您的 while 循环中,您将在每次迭代时重置 $json['categories']

试试

while ($row = mysql_fetch_assoc($result)){ 
    $json['categories'][] = array( 
        "catId"=> $row[catId],
        "catName"=> $row[catName],
        'links' => array( 
            "URL"=> $row[URL],
            "title"=> $row[title],
            "description"=> $row[description]
        )
    );

【讨论】:

  • 这肯定让我得到了更多的结果!但是现在第二个阵列仍然无法正常工作。我已将我的帖子更新为我当前对 PHP 的回复。属于一个类别的所有链接都应显示在该类别下,而不是在具有相同名称的新类别下。
  • 这是因为每次你进入你的while循环;您将删除$json 中的内容尝试将$jon 移出循环,然后将项目推入数组;这将在您第二次进入循环之前保留数组中的数据。
  • 我不完全确定在这种情况下如何应用 array_push
【解决方案2】:

通过按 id 为类别编制索引来跟踪您看到的类别。如果您已经看过该类别,请添加到 links 数组。完成后设置 $json['categories']。

$catRows = array();

while ($row = mysql_fetch_assoc($result)) {
    $id = $row['catId'];
    $links_entry = array(
        'URL' => $row['URL'],
        'title' => $row['title'],
        'description' => $row['description']
    );
    if (!isset($catRows[$id])) {
        $catRows[$id] = array(
            'catId' => $id,
            'catName' => $row['catName'],
            'links' => array($links_entry)
        );
    } else {
        $catRows[$id]['links'][] = $links_entry;
    }
}

$json['categories'] = array_values($catRows);

【讨论】:

  • 正是我需要的。谢谢!
【解决方案3】:

您的第一个问题是“获得单项”。使用

$items = array();   
while ($row = mysql_fetch_assoc($result)){ 
    $json['categories'] = array( 
        "catId"=> $row[catId],
        "catName"=> $row[catName],
        'links' => array( 
            "URL"=> $row[URL],
            "title"=> $row[title],
            "description"=> $row[description]
        )
    );
    $items[] = $json['categories'];
 }

关于在links 数组中有单个条目的下一个问题。您当前的架构有问题。我现在看到的方式是,您有catName,并且您在单个表中获得了有关该 catName 的链接和内容。这太多余了。您可以进一步对其进行规范化,并为 url 链接、标题和描述以及 catId 设置单独的表格,例如 cat_meta 为您指出猫。接下来在选择数据时使用连接。这将从 cat_meta 中返回与您的查询匹配的整数数组。然后你使用 foreach 并迭代它以形成 links 数组。

【讨论】:

  • 我已经添加了我当前的表结构,我相信这就是您的建议。我假设我应该更改我的查询以包含左/右连接?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
  • 2013-04-15
  • 2012-06-30
  • 2018-05-14
  • 2016-08-03
  • 2015-12-11
  • 2014-08-01
相关资源
最近更新 更多