Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 防止阵列中的重复_Php_Mysql_Arrays - Fatal编程技术网

Php 防止阵列中的重复

Php 防止阵列中的重复,php,mysql,arrays,Php,Mysql,Arrays,我有一个从MySQL数据库中提取的数组,我需要将它重新格式化为另一个数组,在特定的键上没有任何重复项 原始阵列: Array // $categories array ( [0] => Array ( [name] => Body & Bath Products [keyword] => body-and-bath-products ) [more ...] ) 新阵列结构

我有一个从MySQL数据库中提取的数组,我需要将它重新格式化为另一个数组,在特定的键上没有任何重复项

原始阵列:

Array // $categories array
(
    [0] => Array
        (
            [name] => Body & Bath Products
            [keyword] => body-and-bath-products
        )
    [more ...]
)
新阵列结构:

Array // $links array
(
    [0] => Array
        (
            [keyword] => Body & Bath Products
            [link] => ./Body-and-Bath-Products
            [target] => _self
            [tooltip] => 1
        )
    [more ...]
)
使用PHP循环:

$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个条目


我知道这很简单,但不知怎么的,我只是错过了它…

您遇到的问题是,您正在用索引键填充$links数组,并且当您检查所述数组中是否存在键时,您正在使用$cat['name']变量作为键。因为$links数组中从来没有这样的内容,所以会得到重复的内容

$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']代替索引号来存储键。
$links=array()

您需要将数字键替换为$cat['name'],并将in_array()方法替换为array_key_exists()方法


in_array()的问题在于它检查顶级数组$links的值,而$links从不将$cat['name']作为值,因为它是数组的一个和一个数组。但是,$links中的数组确实包含$cat['name']。

您遇到的问题是,您正在使用索引键填充$links数组,并且在检查所述数组中是否存在键时,您正在使用$cat['name']变量作为键。因为$links数组中从来没有这样的内容,所以会得到重复的内容

$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']代替索引号来存储键。
$links=array()

您需要将数字键替换为$cat['name'],并将in_array()方法替换为array_key_exists()方法


in_array()的问题在于它检查顶级数组$links的值,而$links从不将$cat['name']作为值,因为它是数组的一个和一个数组。但是,$links中的数组确实包含$cat['name']。

您可以简单地使用另一个
foreach
循环

$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
        );
}

您可以简单地使用另一个
foreach
循环

$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
        );
}

好吧,你的问题是$cat['name']永远不会是$links数组中的一个键。如果你在$links数组中使用var_dump(),你会看到键实际上是从0到n的索引。我知道,我如何测试
$links['keyword']
的值?删除查询中的重复项会更明智。你能谈谈从查询返回的重新记录吗?以及你希望它们的结构如何(例如,当你说“删除”重复了这意味着什么-以某种方式对公共值进行分组,对重复值执行某种聚合,等等)。您可能可以在查询本身中实现所需的功能。您遇到的问题是$cat['name']永远不会是$links数组中的键。如果您使用var_dump()您将看到$links数组中的键实际上是从0到n的索引。我知道,如何测试
$links['keyword']]
的值?删除查询中的重复项会更明智。您可以谈谈从查询返回的重新记录以及您希望它们的结构(即,当您说“删除”时)“复制这意味着什么-以某种方式对公共值进行分组,对重复值执行某种聚合,等等”)。您可能可以在查询本身中实现所需的功能。不,这不起作用,键必须是数字。我需要一种不同的测试方法,而不是在数组()中使用
您需要使用数组\u key\u exists()
数组\u key\u exists()
搜索键,而
在数组中()
搜索给定数组中的值。显然,正如您所提到的,
$cat['name']
永远不会作为密钥出现,因此它不会在
array\u key\u exists()中找到。
您根本没有检查我的解决方案。您尝试使用in_array在$links中查找$cat['name'],但由于您有一个数组,因此无法正常工作。保存自己的代码的唯一方法是添加$cat['name']作为键,并使用array_key_exists()而不是in_array()。然而,你似乎选择了不安全的方式来做这件事。它到底有多不安全?不,那不行,钥匙必须是数字的。我需要一种不同的测试方法,而不是在数组()中使用
您需要使用数组\u key\u exists()
数组\u key\u exists()
搜索键,而
在数组中()
搜索给定数组中的值。显然,正如您所提到的,
$cat['name']
永远不会作为密钥出现,因此它不会在
array\u key\u exists()中找到。
您根本没有检查我的解决方案。您尝试使用in_array在$links中查找$cat['name'],但由于您有一个数组,因此无法正常工作。保存自己的代码的唯一方法是添加$cat['name']作为键,并使用array_key_exists()而不是in_array()。然而,你似乎选择了不安全的方式来做这件事。它到底有多不安全?