我怎么使用array_unique在一系列阵?
-
23-09-2019 - |
题
我有一阵
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
在这里,它是如何工作:
每个阵列项目是串行的。此 将是独一无二的基础上阵的 内容。
结果这是运行过
array_unique
, 所以只有阵列具有独特的 签字的左边。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_reference
和 reference
.可能这些就像是临时身份证。
array_unique deosn't工作递归,所以它只是认为“这都是Array
s,让我们杀死所有,但一个......在这里,我们走!”
快速的答案(概)
- 不同的数值可以从中提取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;
}
那岂不是做的伎俩?