【问题标题】:array unique for multi dimensional array in phpphp中多维数组的唯一数组
【发布时间】:2019-04-05 13:57:39
【问题描述】:

首先,这不是一个重复的问题,因为我已经尝试了大部分堆栈答案。

我的数组中有大约138886 记录。

记录就像

[1] => Array
        (
            [country] => US
            [state] => Albama
            [city] => Brest
            [postcode] => 225001-225003
            [shipping_info] => Delivery Available
            [is_zip_range] => 1
            [zip_from] => 225001
            [zip_to] => 225003
        )

    [2] => Array
        (
            [country] => BY
            [state] => Brest
            [city] => Brest
            [postcode] => 225001-225003
            [shipping_info] => Delivery Available
            [is_zip_range] => 1
            [zip_from] => 225001
            [zip_to] => 225003
        )

我想从postcode 值中唯一的所有记录我尝试过的一些方法是

方法一

$temp = array_unique(array_column($data, 'postcode'));
$filteredData = array_intersect_key($data, $temp);

但它仍然给出重复值。

方法二

$filteredData = array_map("unserialize", array_unique(array_map("serialize", $data)));   

这是行不通的

方法三

function unique_multidim_array($array, $key) { 
    $temp_array = array(); 
    $i = 0; 
    $key_array = array(); 

    foreach($array as $val) { 
        if (!in_array($val[$key], $key_array)) { 
            $key_array[$i] = $val[$key]; 
            $temp_array[$i] = $val; 
        } 
        $i++; 
    } 
    return $temp_array; 
} 
$details = unique_multidim_array($array,'postcode');

它正在运行,但速度太慢,大约需要 2/3 分钟。

让我知道我可以用于唯一数组的任何其他方法。 帮助将不胜感激

【问题讨论】:

  • 你试过了吗 - array_column($data, null, 'postcode')
  • @NigelRen 似乎,OP 正在等待 array_column 最后 15 分钟的结果 :)
  • 这很奇怪。我从方法 3 中针对数组中的 100 万个值运行该函数,处理时间为 2 秒。这意味着你的机器真的很慢。希望您在生产中没有那么慢的机器。
  • @NigelRen 是的,它正在工作。

标签: php arrays performance multidimensional-array


【解决方案1】:

你为什么这么难,

 $in = array (
    1 => 
    array (
        'country' => 'US',
        'state' => 'Albama',
        'city' => 'Brest',
        'postcode' => '225001-225003',
        'shipping_info' => 'DeliveryAvailable',
        'is_zip_range' => 1,
        'zip_from' => 225001,
        'zip_to' => 225003
    ),
    2 => 
    array (
        'country' => 'BY',
        'state' => 'Brest',
        'city' => 'Brest',
        'postcode' => '225001-225003',
        'shipping_info' => 'DeliveryAvailable',
        'is_zip_range' => 1,
        'zip_from' => 225001,
        'zip_to' => 225003
    )
);

$out = [];
foreach($in as $i) if(!isset($out[$i['postcode']])) $out[$i['postcode']] = $i;

Sandbox

你可以用 in_array 做同样的事情,但是 isset 更快。

其实你甚至不需要做isset

foreach($in as $i) $out[$i['postcode']] = $i;

数组键始终是唯一的,但这将保留最后一个副本,而之前的代码保留第一个。

如果你后面的键出错了,只需执行$out = array_values($out) 重置它们。

【讨论】:

  • 让我检查一下。
  • 它别无选择,只能工作。不需要在“字段”上进行内部循环,因为您已经知道想要什么字段,@ 987654325@ 事实上,您甚至不需要做 isset 因为下一个副本将覆盖前一个,这取决于什么你要先。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多