【问题标题】:php: Assigning Array Keys when creating multilevel arrayphp:创建多级数组时分配数组键
【发布时间】:2016-07-19 08:55:27
【问题描述】:

我继承了项目,数据结构有点乱。基本上,用户输入的数据是非层次结构的(“pages”不是“book title”的属性,但两者都只是没有任何关系的值)。

现在我想创建一个更有序的结构,即我想按作者列出书籍并按标题列出书籍详细信息。

foreach($items as $item){
    $books[$item->author][$item->title] = array(
        "pages"      => $item->details->pages->value,
        "published"  => $item->details->year->value,
        "genres"     => $item->details->genres->value
    );
}

我想将键分配给前两个数组级别。我试过$books["author" => $item->author]["title" => $item->title],但收到一条错误消息。

如何在这种情况下分配键,而不必通过多个 foreach 循环运行整个事情?

编辑:关于对象结构的注释:

网站在 CMS 上运行,客户使用插件构建了自己的输入表单。 所有数据都保存在博客文章中。这些博文有默认输入字段($item->author 和 $item->title),然后有一个自定义字段选项,客户端可以在其中输入所有详细信息,即 $item->details->pages->value(值为在该字段的输入值中)。

所需的结构是这样的:

  • 书籍
    • 作者
      • 标题
        • 流派(数组)
      • 标题
        • 流派(数组)
      • 标题
        • 流派(数组)
    • 作者
      • 标题
        • 流派(数组)
      • 标题
        • 流派(数组)
      • 标题
        • 流派(数组)

这将允许我遍历整个 $books 数组,为每个作者创建一个并创建一个表,其中列出了一个 $title 以及每行的详细信息。

【问题讨论】:

  • 错误信息是什么?
  • 你试过 $item->author->value 和 $item->title->value... 在 $item 对象上使用 var_dump 来查看它的结构。
  • 我很难理解您寻求的确切转换。在您的问题中,显示您当前结构的摘录,以及最终结构的预期结果。
  • 让我们保持简单并从以下开始:期望的结果数据结构是什么?使用不起作用的代码示例并不能说明很多。
  • 我更新了描述以使请求更加具体。

标签: php arrays associative-array


【解决方案1】:

试试这个,

$books=array();
foreach($items as $item){
    $books[]=array(
       'author'=>$item->author,
       'title'=>$item->title,
       'details'=>array(
         "pages"      => $item->details->pages->value,
         "published"  => $item->details->year->value,
         "genres"     => $item->details->genres->value
        )
     );
}

更新的代码,你只需要在[$item->author][$item->title]之后的[],这样它就可以是你想要的authortitle的多维数组,

$books=array();
foreach($items as $item){
    $books[$item->author][$item->title][] =array(
         // ---------------------------^^, this will make it nested array
         "pages"      => $item->details->pages->value,
         "published"  => $item->details->year->value,
         "genres"     => $item->details->genres->value
     );
}

然后像这样访问数组,

$str='';
foreach($books as $author=>$titleDetails){
    $str.='<h1>'.$author.'</h1>';
    foreach($titleDetails as $title=>$details){
       $str.='<br/><h2>'.$title.'</h2>';
       $str.='<br/><h3>'.$details['pages'].'</h3>';//.. and so on
    }

}
echo $str;

【讨论】:

  • 这与他尝试的类似...如果我们可以看一下对象结构会更有用。
  • I would like to assign keys to the first two array levels 表示他想使用像authortitle 这样的静态键,所以我在同一个数组中添加了details。另外,$books 应该是数组的数组,可能是作者和标题相同,不同的出版年份。
  • 我刚刚更新了原始问题,使其更清楚我想去哪里。
  • 试试我更新的答案,如果它不起作用,那么告诉我你的 $items 数组。
  • 我们越来越近了,但是在这种结构中如何访问作者?我可以通过键引用“页面”等以将它们回显,但不确定如何使用作者和标题值来执行此操作。 (即&lt;h1&gt;&lt;?php echo $books[???] ?&gt;&lt;/h1&gt;)?
【解决方案2】:
@media (min-width:481px){
#yiv1734505183 .yiv1734505183mobile-hide{
display:block;overflow:visible;width:auto
!important;max-height:inherit !important;min-height:auto
!important;}

}@media (min-width:481px

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-10
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多