首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >防止数组中的重复

防止数组中的重复
EN

Stack Overflow用户
提问于 2013-09-09 23:43:20
回答 2查看 1.3K关注 0票数 1

我有一个从MySQL db中提取的数组,我需要将它重新格式化为另一个数组,而不需要在特定的键上重复。

原始数组:

代码语言:javascript
运行
复制
Array // $categories array
(
    [0] => Array
        (
            [name] => Body & Bath Products
            [keyword] => body-and-bath-products
        )
    [more ...]
)

新阵列结构:

代码语言:javascript
运行
复制
Array // $links array
(
    [0] => Array
        (
            [keyword] => Body & Bath Products
            [link] => ./Body-and-Bath-Products
            [target] => _self
            [tooltip] => 1
        )
    [more ...]
)

循环使用PHP:

代码语言:javascript
运行
复制
$links = array();

foreach ($categories as $cat):
    if (in_array ($cat['name'], $links)):
        continue;
    else:
        $links[] = array(
            'keyword' => $cat['name'],
            'link' => './' . $this->url->cap_keyword($cat['keyword']),
            'target' => '_self',
            'tooltip' => true
        );
    endif;
endforeach;

但这不起作用,我的$links数组中仍有534个条目。

我知道这很简单,但我就是想不起来.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-10 00:04:29

您只需使用另一个foreach循环..。

代码语言:javascript
运行
复制
$links = array();

foreach ($categories as $cat){

    foreach($links as $value){ // Loop through $links array
        if($value['keyword'] == $cat['name']) // Check if $cat['name'] is already in $links
            continue 2; // Skip rest of this loop and parent loop if it exists
    }


    $links[] = array(
        'keyword' => $cat['name'],
        'link' => './' . $this->url->cap_keyword($cat['keyword']),
        'target' => '_self',
        'tooltip' => true
        );
}
票数 1
EN

Stack Overflow用户

发布于 2013-09-09 23:52:44

您的问题是,您正在使用索引键填充$links数组,当您检查该数组中是否存在密钥时,您将使用$cat‘’name‘变量作为键。因为这在$links数组中从未出现过,所以您会得到重复的。

代码语言:javascript
运行
复制
$links = array();

foreach ($categories as $cat):
    if (in_array ($cat['name'], $links)): // HERE YOU CHECK IF $links CONTAINS $cat['name'] HOWEVER YOU NEVER STORE $cat['name'] AS KEY
        continue;
    else:
        $links[] = array( // HERE YOU STORE EACH ENTRY WITH KEY AS INDEX FROM 0 TO N
            'keyword' => $cat['name'],
            'link' => './' . $this->url->cap_keyword($cat['keyword']),
            'target' => '_self',
            'tooltip' => true
        );
    endif;
endforeach;

解决方案是用$cat‘’name‘而不是索引号来存储密钥。

代码语言:javascript
运行
复制
 $links = array();
代码语言:javascript
运行
复制
foreach ($categories as $cat):
    if (array_key_exists ($cat['name'], $links)): 
        continue;
    else:
        $links[$cat['name']] = array( // You should save the entry using $cat['name'] as key for the entry this way when you do the in_array check you can prevent duplicates
            'keyword' => $cat['name'],
            'link' => './' . $this->url->cap_keyword($cat['keyword']),
            'target' => '_self',
            'tooltip' => true
        );
    endif;
endforeach;

您需要用键$cat‘’name‘替换数字键,用array_key_exists()方法替换array_key_exists()方法。

in_array()的问题在于它检查顶级数组的值,$links和$links从来不包含$cat‘’name‘作为值,因为它是数组的数组。然而,$links中的数组确实包含$cat‘’name‘。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18708709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档