【问题标题】:Match elements with same name inside an array匹配数组中同名的元素
【发布时间】:2017-11-23 17:15:31
【问题描述】:

我有以下代码来获取我的所有过滤器元素,并使用标题 (getName) 及其内部元素 (getHtml) 来回显每个过滤器元素。我想要的是检查标题并合并相同的标题以显示所有内部元素而不重复相同的标题。

例如,如果我有一个名为 FILTER-AB 且包含元素 1 和 2 的过滤器,以及另一个名为 FILTER-AB 且包含元素 3 和 4 的过滤器,我只想回显一个标题为 FILTER-AB 和内部的表元素 1、2、3 和 4。参见下面更简单的示例

EDIT 例如,HTML 元素是一个元素列表,这些元素在这里并不重要。过滤器名称由第三行的“getName”方法获取(然后写为 dt 类),元素由第 7 行的“getHtml”方法获取(然后写为内部 Html 元素 dd 类)

我想不出任何方法可以做到这一点,请提供任何帮助或指导!

<?php foreach ($_filters as $_filter): ?>
             <?php if($_filter->getItemsCount()): ?>
                   <dt><?php echo $this->__($_filter->getName()) ?></dt>
                                 (Not important line)      <?php if($_searchFilter !== false): ?>
                                 (Not important line)        <dt class="attribute_value_search_box<?php if($_searchFilter !== true): ?> enabled<?php endif; ?>"><input type="text" placeholder="<?php echo $this->__('Search for option'); ?>" /></dt>
                                 (Not important line)      <?php endif;?>
                   <dd><?php echo $_filter->getHtml() ?></dd>
             <?php endif; ?>
<?php endforeach; ?>

示例(我现在拥有的)

<dt class="even">Brand</dt>
<dd class="even">
    <li>
Element 1
    </li>   
</dd>
<dt class="odd">Brand</dt>
<dd class="odd">
    <li>
Element 2
    </li>   
</dd>
<dt class="even">Type</dt>
<dd class="even">
    <li>
Element 3
    </li>   
</dd>

预期结果

<dt class="even">Brand</dt>
<dd class="even">
    <li>
Element 1
    </li>
    <li>
Element 2
    </li>
</dd>
<dt class="odd">Type</dt>
<dd class="odd">
    <li>
Element 3
    </li>   
</dd>

【问题讨论】:

  • 我建议你先修复你的数据来做这个服务器端。如果你在 JS 中做客户端,你很可能会在 JS 执行之前得到一个 FOUC,这对你的用户来说真的很刺耳
  • 我认为我不能那样做,因为我的过滤器列表取决于用户正在查看的页面上显示的产品集合。

标签: javascript php jquery html magento


【解决方案1】:

使用name 作为键将您的数据映射到数组的分组数组。然后迭代该数组以生成 html

类似:

<?php 
$data = array();
foreach ($_filters as $_filter) {
    if ($_filter->getItemsCount()) {
        $name = $this->$_filter->getName();           
        $data[$name][] = $_filter->getHtml();
    }
?>

<?php foreach ($data as $name => $items): ?>
   <dl>
        <dt><?php echo $name ?>
            <dl>
                <dt class="attribute_value_search_box<?php if ($_searchFilter !== true): ?> enabled<?php endif; ?>">
                <input type="text" placeholder="<?php echo $this->__('Search for option'); ?>">
                </dt>
                <?php foreach ($items as $html): ?>
                    <dd><?php echo $html ?></dd>
                <?php endforeach; ?>
           </dl>
        </dt>
   </dl>
<?php endforeach; ?>

【讨论】:

  • 我正在做一些修改,但这个想法似乎奏效了。我正在为同一个标题获得多个回声,直到它最终合并元素.. 感谢您的提示!
  • 很常见的需要映射您的数据以满足您的需求..无论是在服务器端代码还是在客户端代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多