我需要从一个特定的代码数组中删除重复项


I need to remove duplicates from an array from a specific code

我有以下代码:

public function ajax()
{
    // Contains results
    $data = array();
    if( isset($this->request->get['keyword']) ) {
        // Parse all keywords to lowercase
        $keywords = strtolower( $this->request->get['keyword'] );
        // Perform search only if we have some keywords
        if( strlen($keywords) >= 3 ) {
            $parts = explode( ' ', $keywords );
            $add = '';
            // Generating search
            foreach( $parts as $part ) {
                $add .= ' AND (LOWER(pd.name) LIKE "%' . $this->db->escape($part) . '%"';
                $add .= ' OR LOWER(p.model) LIKE "%' . $this->db->escape($part) . '%")';
            }
            $add = substr( $add, 4 );
            $sql  = 'SELECT pd.product_id, pd.name, p.model FROM ' . DB_PREFIX . 'product_description AS pd ';
            $sql .= 'LEFT JOIN ' . DB_PREFIX . 'product AS p ON p.product_id = pd.product_id ';
            $sql .= 'LEFT JOIN ' . DB_PREFIX . 'product_to_store AS p2s ON p2s.product_id = pd.product_id ';
            $sql .= 'WHERE ' . $add . ' AND p.status = 1 ';
            $sql .= ' AND p2s.store_id =  ' . (int)$this->config->get('config_store_id'); 
            $sql .= ' ORDER BY LOWER(pd.name) ASC, LOWER(p.model) ASC';
            $sql .= ' LIMIT 15';
            $res = $this->db->query( $sql );
            if( $res ) {
                $data = ( isset($res->rows) ) ? $res->rows : $res->row;
                // For the seo url stuff
                $basehref = 'product/product&keyword=' . $this->request->get['keyword'] . '&product_id=';
                foreach( $data as $key => $values ) {
                    $data[$key] = array(
                        'name' => htmlspecialchars_decode($values['name'] . ' (' . $values['model'] . ')', ENT_QUOTES),
                        'href' => $this->url->link($basehref . $values['product_id'])
                    );
                }
            }
        }
    }
    echo json_encode( $data );
}

因此,数组生成一个产品列表,例如:

Apple MacBook (Product Model 10)

苹果МакБук(产品型号10)

问题是这两个产品实际上是同一个产品(相同的product_id),但语言不同,并且都有相同的URL。

所以,我想检查的是,在制作数组时,代码检查数组中是否已经有一个具有product_id的产品,如果有,不要添加另一个具有相同product_id的产品。

实际上,我不希望数组生成两个或多个具有相同product_id的产品。

EDIT:有了Marc的代码和ghbarratt的建议,工作就像魅力一样。万分感谢你们,也感谢在座的各位。

注:如何为添加ASC或DESC ORDER BY pd.language_id:

$sql .= ' ORDER BY pd.language_id = ' . (int)$this->config->get('config_language_id');
$sql .= ' , LOWER(pd.name) ASC, LOWER(p.model) ASC';
$data = array();
foreach ($res->rows as $values) {
    $data[$values['product_id']] = array(
        'name' => ...,
        'href' => ...
    );
}

保证唯一的产品id。

最简单的方法应该是添加另一个数组来跟踪已经写入的id,并检查http://php.net/manual/en/function.in-array.php:

$basehref = 'product/product&keyword=' . $this->request->get['keyword'] . '&product_id=';
$writtenIds = array();
foreach( $data as $key => $values ) {
    if(in_array($values['product_id'], $writtenIds)) 
    { 
        unset($data[$key]); 
        continue; 
    }
    $data[$key] = array(
        'name' => htmlspecialchars_decode($values['name'] . ' (' . $values['model'] . ')', ENT_QUOTES),
        'href' => $this->url->link($basehref . $values['product_id'])
    );
    $writtenIds[] = $values['product_id'];
}

这个答案与Marc的答案相似,除了它将在数据数组的另一个元素中保留product_id的其他名称,并且它将确保删除与第一个遇到的product_id相同的子数组,我相信这是您想要做的重要部分。

$product_ids_added = array();
foreach( $data as $key => $values ) {
        $original_key = array_search($values['product_id'], $product_ids_added);
        if($original_key===false) {
                $data[$key] = array(
                        'name' => htmlspecialchars_decode($values['name'] . ' (' . $values['model'] . ')', ENT_QUOTES),
                        'href' => $this->url->link($basehref . $values['product_id'])
                );
                $product_ids_added[] = $values['product_id'];
        }
        else {
                unset($data[$key]);
                if(!isset($data[$original_key]['additional_names'])) $data[$original_key]['additional_names'] = array();
                $data[$original_key]['additional_names'][] = htmlspecialchars_decode($values['name'] . ' (' . $values['model'] . ')', ENT_QUOTES);
        }
}