我有一阵

Array(
[0] => Array
    (
        [0] => 33
        [user_id] => 33
        [1] => 3
        [frame_id] => 3
    )

[1] => Array
    (
        [0] => 33
        [user_id] => 33
        [1] => 3
        [frame_id] => 3
    )

[2] => Array
    (
        [0] => 33
        [user_id] => 33
        [1] => 8
        [frame_id] => 8
    )

[3] => Array
    (
        [0] => 33
        [user_id] => 33
        [1] => 3
        [frame_id] => 3
    )

[4] => Array
    (
        [0] => 33
        [user_id] => 33
        [1] => 3
        [frame_id] => 3
    )

)

正如你可以看到关键0相同1、3和4。和钥匙2不同的是从他们所有。

当运行array_unique功能在他们身上,唯一留下的就是

Array (
[0] => Array
    (
        [0] => 33
        [user_id] => 33
        [1] => 3
        [frame_id] => 3
    )
)

任何想法为什么array_unique不工作的期望吗?

有帮助吗?

解决方案

这是因为 array_unique 进行比较的项目使用的字符串的比较。从 文档:

注:两个元素是认为 等于如果并且只if(string)$elem1 ===(string)$elem2.在的话:当串的表示是相同的。第一个元素是用的。

串代表性的一系列只是简单的词 Array, 不管是什么内容。

你可以做你想要做什么通过使用如下:

$arr = array(
    array('user_id' => 33, 'frame_id' => 3),
    array('user_id' => 33, 'frame_id' => 3),
    array('user_id' => 33, 'frame_id' => 8)
);

$arr = array_intersect_key($arr, array_unique(array_map('serialize', $arr)));

//result:
array
  0 => 
    array
      'user_id' => int 33
      'user' => int 3
  2 => 
    array
      'user_id' => int 33
      'user' => int 8

在这里,它是如何工作:

  1. 每个阵列项目是串行的。此 将是独一无二的基础上阵的 内容。

  2. 结果这是运行过 array_unique, 所以只有阵列具有独特的 签字的左边。

  3. array_intersect_key 将带 钥匙的独特的项目 地图/独特的功能(由于源阵列的钥匙的保留)和拉 他们出来的你的原始来源 阵列。

其他提示

array_unique()只支持在PHP 5.2.9多维数组和更高。

相反,可以创建所述阵列的散列,并且检查它的独特的烦躁。

$hashes = array(); 

foreach($array as $val) { 
    $hashes[md5(serialize($val))] = $val; 
} 

array_unique($hashes);

这是一个改进版的 @ryeguy的答案:

<?php

$arr = array(
    array('user_id' => 33, 'tmp_id' => 3),
    array('user_id' => 33, 'tmp_id' => 4),
    array('user_id' => 33, 'tmp_id' => 5)
);


# $arr = array_intersect_key($arr, array_unique(array_map('serialize', $arr)));
$arr = array_intersect_key($arr, array_unique(array_map(function ($el) {
    return $el['user_id'];
}, $arr)));

//result:
array
  0 => 
    array
      'user_id' => int 33
      'tmp_id' => int 3

首先,它不会做不需要序列化。第二,有时候特性可能是不同的,甚至使id是一样的。

我碰到它 谷歌的地方API.我相结合的结果的数次请求与不同类型的对象(认为标记)。但我得到了重复,因为一个目可放入几个类别(类型)。和方法 serialize 没有工作,因为attrs是不同的,即, photo_referencereference.可能这些就像是临时身份证。

array_unique deosn't工作递归,所以它只是认为“这都是Arrays,让我们杀死所有,但一个......在这里,我们走!”

快速的答案(概)

  • 不同的数值可以从中提取PHP列AssociativeArrays使用foreach
  • 这是一个简单的方法

详细的回答

上下文

  • PHP5.3
  • PHP列AssociativeArrays(tabluar复合的数据变量)
  • 备用名称为这个综合变量ArrayOfDictionary(气溶胶光学厚度)

的问题

  • 方案: DeveloperMarsher有PHP表格的复合变量
    • DeveloperMarsher希望提取不同的价值观在特定名称的价值对
    • 在下面的例子中,DeveloperMarsher希望得到行的每个不同的 fname 名值对

解决方案

  • example01;;DeveloperMarsher开始tabluar数据变量,看起来像这样

    $aodtable = json_decode('[
    {
      "fname": "homer"
      ,"lname": "simpson"
    },
    {
      "fname": "homer"
      ,"lname": "jackson"
    },
    {
      "fname": "homer"
      ,"lname": "johnson"
    },
    {
      "fname": "bart"
      ,"lname": "johnson"
    },
    {
      "fname": "bart"
      ,"lname": "jackson"
    },
    {
      "fname": "bart"
      ,"lname": "simpson"
    },
    {
      "fname": "fred"
      ,"lname": "flintstone"
    }
    ]',true);
    
  • example01;;DeveloperMarsher可以提取不同的价值观与foreach循环轨道看到的价值观

    $sgfield  =   'fname';
    $bgnocase =   true;
    
    //
    $targfield  =   $sgfield;
    $ddseen     =   Array();
    $vout       =   Array();
    foreach ($aodtable as $datarow) {
    if( (boolean) $bgnocase == true ){ @$datarow[$targfield] = @strtolower($datarow[$targfield]); }
    if( (string) @$ddseen[ $datarow[$targfield] ] == '' ){
      $rowout   = array_intersect_key($datarow, array_flip(array_keys($datarow)));
      $ddseen[ $datarow[$targfield] ] = $datarow[$targfield];
      $vout[] = Array( $rowout );
    }
    }
    //;;
    
    print var_export( $vout, true );
    

输出结果

array (
  0 =>
  array (
    0 =>
    array (
      'fname' => 'homer',
      'lname' => 'simpson',
    ),
  ),
  1 =>
  array (
    0 =>
    array (
      'fname' => 'bart',
      'lname' => 'johnson',
    ),
  ),
  2 =>
  array (
    0 =>
    array (
      'fname' => 'fred',
      'lname' => 'flintstone',
    ),
  ),
)

陷阱

  • 这种解决方案并不总的领域,不属于不同的动作
  • 任意名值对返回从任意选择的不同行
  • 任意排序的输出
  • 任意的处理信情况(为首都的一个独特的从较低的情况下一个?)

也参看

  • php array_intersect_key
  • php array_flip
function array_unique_recursive($array)
{
    $array = array_unique($array, SORT_REGULAR);

    foreach ($array as $key => $elem) {
        if (is_array($elem)) {
            $array[$key] = array_unique_recursive($elem);
        }
    }

    return $array;
}

那岂不是做的伎俩?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top