Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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_Arrays_Performance_Multidimensional Array_Associative Array - Fatal编程技术网

PHP-数组为“唯一”

PHP-数组为“唯一”,php,arrays,performance,multidimensional-array,associative-array,Php,Arrays,Performance,Multidimensional Array,Associative Array,我有一个如下所示的数组: array(43197) { [0]=> array(4) { ["id"]=> string(5) "10038" ["country"]=> string(7) "Andorra" ["city"]=> string(16) "Andorra la Vella" ["name"]=> string(25) "Andorra la Vella Heliport" } [1]=>

我有一个如下所示的数组:

array(43197) {
 [0]=> array(4) {
     ["id"]=> string(5) "10038"
     ["country"]=> string(7) "Andorra"
     ["city"]=> string(16) "Andorra la Vella"
     ["name"]=> string(25) "Andorra la Vella Heliport" 
    }
 [1]=> array(4) {
     ["id"]=> string(5) "10040"
     ["country"]=> string(20) "United Arab Emirates"
     ["city"]=> string(17) "Abu Dhabi Emirate"
     ["name"]=> string(11) "Ras Sumeira" 
    }
 [2]=> array(4) {
     ["id"]=> string(5) "10041"
     ["country"]=> string(20) "United Arab Emirates"
     ["city"]=> string(13) "Dubai Emirate"
     ["name"]=> string(27) "Burj al Arab Resort Helipad" 
    }
 [3]=> array(4) {
     ["id"]=> string(5) "10042"
     ["country"]=> string(20) "United Arab Emirates"
     ["city"]=> string(13) "Dubai Emirate"
     ["name"]=> string(13) "Dubai Skydive" 
    }
 [4]=> array(4) {
     ["id"]=> string(5) "14243"
     ["country"]=> string(20) "United Arab Emirates"
     ["city"]=> string(13) "Dubai Emirate"
     ["name"]=> string(15) "Dubai Creek SPB" 
    }
 [5]=> array(4) {
     ["id"]=> string(5) "29266"
     ["country"]=> string(20) "United Arab Emirates"
     ["city"]=> string(17) "Abu Dhabi Emirate"
     ["name"]=> string(18) "Yas Island Airport" 
    }
...
}
现在我想让这个数组“唯一”,以便以后能够创建一些选择框。 我已经有了一个可以正常工作的函数。。。不幸的是,完成一个非常大的阵列需要几个小时:

有没有办法让这个功能更快

function array_to_unique(//This function returns an array of unique values by given array
    //Version: 2.0.0.0
    $array,
    $uniqueCol)
    {
    $returnArray = array();

    $count = count($array);
    echo '<br>array count previous unique is: ' .$count;

    //Do the if(isset($uniqueCol)) just once - this is more code but faster with long arrays    
    if(isset($uniqueCol))
        {
        $helparray = array();
        foreach($array as $row)
            {
            if(!(in_array($row[$uniqueCol],$helparray)))
                {
                $helparray[] = $row[$uniqueCol];
                $returnArray[] = $row;
                }
            }
        }
    else{
        foreach($array as $row)
            {
            if(!(in_array($row,$returnArray)))
                {$returnArray[] = $row;}
            }
        }

    $count = count($returnArray);
    echo '<br>array count after unique is: ' .$count;

    return $returnArray;
    }
提前感谢

in_数组的复杂性为On,这意味着它必须遍历所有元素。这会使你的代码变慢

如果值已经存在,则可以使用哈希映射而不是搜索数组值来优化查找。幸运的是,PHP中的关联数组是这样实现的,因此我们可以使用该值作为键,并使用array_key_进行查找

而不是:

    $helparray = array();
    foreach($array as $row)
        {
        if(!(in_array($row[$uniqueCol],$helparray)))
            {
            $helparray[] = $row[$uniqueCol];
            $returnArray[] = $row;
            }
        }
采取:

另一个非常大的数组要考虑的是,将值复制到一个新的数组中,这会增加内存占用。如果返回数组的键是0索引连续整数对您来说并不重要,则可以从原始数组中删除重复项:

    $helparray = array();
    foreach($array as $key => $row)
        {
        if(!(array_key_exists($row[$uniqueCol], $helparray)))
            {
            $helparray[$row[$uniqueCol]] = true;
            }
            else
            {
            unset($array[$key]);
            }
        }
in_数组的复杂性为On,这意味着它必须遍历所有元素。这会使你的代码变慢

如果值已经存在,则可以使用哈希映射而不是搜索数组值来优化查找。幸运的是,PHP中的关联数组是这样实现的,因此我们可以使用该值作为键,并使用array_key_进行查找

而不是:

    $helparray = array();
    foreach($array as $row)
        {
        if(!(in_array($row[$uniqueCol],$helparray)))
            {
            $helparray[] = $row[$uniqueCol];
            $returnArray[] = $row;
            }
        }
采取:

另一个非常大的数组要考虑的是,将值复制到一个新的数组中,这会增加内存占用。如果返回数组的键是0索引连续整数对您来说并不重要,则可以从原始数组中删除重复项:

    $helparray = array();
    foreach($array as $key => $row)
        {
        if(!(array_key_exists($row[$uniqueCol], $helparray)))
            {
            $helparray[$row[$uniqueCol]] = true;
            }
            else
            {
            unset($array[$key]);
            }
        }
只需利用密钥是唯一的这一事实,就可以在一次过程中自动消除阵列中的重复数据。如果不喜欢新键,请在之后使用数组_值


只需利用密钥是唯一的这一事实,就可以在一次过程中自动消除阵列中的重复数据。如果不喜欢新键,请在之后使用数组值。

预期结果是什么?预期结果是什么?
$deduplicated = [];
foreach ($array as $value) {
    $deduplicated[$value['country']] = $value;
}