1

我有一个从 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 个条目。

我知道这很简单,但我只是想念它......

4

2 回答 2

1

你可以简单地使用另一个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
        );
}
于 2013-09-10T00:04:29.947 回答
0

您遇到的问题是您正在使用索引键填充 $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'] 而不是索引号来存储键。
$链接 = 数组();

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'] 和 in_array() 方法用 array_key_exists() 方法替换数字键。

in_array() 的问题是它检查顶部数组 $links 的值,而 $links 永远不会包含 $cat['name'] 作为值,因为它是数组数组。但是,$links 中的数组确实包含 $cat['name']。

于 2013-09-09T23:52:44.317 回答