Php 防止阵列中的重复
我有一个从MySQL数据库中提取的数组,我需要将它重新格式化为另一个数组,在特定的键上没有任何重复项 原始阵列:Php 防止阵列中的重复,php,mysql,arrays,Php,Mysql,Arrays,我有一个从MySQL数据库中提取的数组,我需要将它重新格式化为另一个数组,在特定的键上没有任何重复项 原始阵列: Array // $categories array ( [0] => Array ( [name] => Body & Bath Products [keyword] => body-and-bath-products ) [more ...] ) 新阵列结构
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()。然而,你似乎选择了不安全的方式来做这件事。它到底有多不安全?