PHP检测非字符串重复项,并将其按出现顺序添加到数组中
我有一个PHP mysql_fetch_对象生成的数组转储:PHP检测非字符串重复项,并将其按出现顺序添加到数组中,php,arrays,duplicates,Php,Arrays,Duplicates,我有一个PHP mysql_fetch_对象生成的数组转储: Array ( [0] => stdClass Object ( [lat] => 44.510728 [lon] => 26.276657 ) [1] => stdClass Object ( [lat] => 44.510954 [lon] => 26.277879 ) [2] => stdClass Object ( [lat] => 44.510954 [lon] =>
Array (
[0] => stdClass Object ( [lat] => 44.510728 [lon] => 26.276657 )
[1] => stdClass Object ( [lat] => 44.510954 [lon] => 26.277879 )
[2] => stdClass Object ( [lat] => 44.510954 [lon] => 26.277879 )
[3] => stdClass Object ( [lat] => 44.511655 [lon] => 26.278041 )
[4] => stdClass Object ( [lat] => 44.510946 [lon] => 26.275215 )
[5] => stdClass Object ( [lat] => 44.510946 [lon] => 26.275215 )
[6] => stdClass Object ( [lat] => 44.510946 [lon] => 26.275215 )
)
我试图检测重复项并将其添加到与new key->Value相同的数组中,其在数组中的出现顺序如下:
Array (
[0] => stdClass Object ( [lat] => 44.510728 [lon] => 26.276657 )
[1] => stdClass Object ( [lat] => 44.510954 [lon] => 26.277879 [order] => [0] )
[2] => stdClass Object ( [lat] => 44.510954 [lon] => 26.277879 [order] => [1] )
[3] => stdClass Object ( [lat] => 44.511655 [lon] => 26.278041 )
[4] => stdClass Object ( [lat] => 44.510946 [lon] => 26.275215 [order] => [0] )
[5] => stdClass Object ( [lat] => 44.510946 [lon] => 26.275215 [order] => [1] )
[6] => stdClass Object ( [lat] => 44.510946 [lon] => 26.275215 [order] => [2] )
)
foreach ($objects as $object) {
if (property_exists($object, 'order')) continue;
$matches = array_keys($objects, $object);
if (count($matches) > 1) {
foreach ($matches as $order => $match) {
$objects[$match]->order = $order;
}
}
}
var_dump($objects);
谢谢 我在谷歌上随机发现了这个问题,完全是为了寻找其他的东西——请原谅我回答得太晚了,但是这个问题没有得到回答,我想我有一个有用的答案
array\u keys()
的一个有趣之处在于,它采用可选的第二个值作为搜索值,该值检索数组中所有匹配元素的键/索引
假设一个数组$objects
复制您的数据集:
$objects = [
(object) ['lat' => 44.510728, 'lon' => 26.276657 ],
(object) ['lat' => 44.510954, 'lon' => 26.277879 ],
(object) ['lat' => 44.510954, 'lon' => 26.277879 ],
(object) ['lat' => 44.511655, 'lon' => 26.278041 ],
(object) ['lat' => 44.510946, 'lon' => 26.275215 ],
(object) ['lat' => 44.510946, 'lon' => 26.275215 ],
(object) ['lat' => 44.510946, 'lon' => 26.275215 ],
];
如果我们迭代这个对象数组,我们可以检索当前搜索对象和数组中任何相等对象的索引;i、 e:具有匹配属性和值的同一类的其他实例
大概是这样的:
Array (
[0] => stdClass Object ( [lat] => 44.510728 [lon] => 26.276657 )
[1] => stdClass Object ( [lat] => 44.510954 [lon] => 26.277879 [order] => [0] )
[2] => stdClass Object ( [lat] => 44.510954 [lon] => 26.277879 [order] => [1] )
[3] => stdClass Object ( [lat] => 44.511655 [lon] => 26.278041 )
[4] => stdClass Object ( [lat] => 44.510946 [lon] => 26.275215 [order] => [0] )
[5] => stdClass Object ( [lat] => 44.510946 [lon] => 26.275215 [order] => [1] )
[6] => stdClass Object ( [lat] => 44.510946 [lon] => 26.275215 [order] => [2] )
)
foreach ($objects as $object) {
if (property_exists($object, 'order')) continue;
$matches = array_keys($objects, $object);
if (count($matches) > 1) {
foreach ($matches as $order => $match) {
$objects[$match]->order = $order;
}
}
}
var_dump($objects);
上述代码的快速摘要:
- 迭代
列表$objects
- 如果
包含已处理的$object
属性-跳过order
- 否则,获取数组中所有匹配对象的索引
- 对于大于一个(当前对象)匹配,循环匹配索引
- 将“顺序”属性应用于所有匹配的对象
array (size=7)
0 =>
object(stdClass)[1]
public 'lat' => float 44.510728
public 'lon' => float 26.276657
1 =>
object(stdClass)[2]
public 'lat' => float 44.510954
public 'lon' => float 26.277879
public 'order' => int 0
2 =>
object(stdClass)[3]
public 'lat' => float 44.510954
public 'lon' => float 26.277879
public 'order' => int 1
3 =>
object(stdClass)[4]
public 'lat' => float 44.511655
public 'lon' => float 26.278041
4 =>
object(stdClass)[5]
public 'lat' => float 44.510946
public 'lon' => float 26.275215
public 'order' => int 0
5 =>
object(stdClass)[6]
public 'lat' => float 44.510946
public 'lon' => float 26.275215
public 'order' => int 1
6 => &
object(stdClass)[7]
public 'lat' => float 44.510946
public 'lon' => float 26.275215
public 'order' => int 2
我想你在找“array\u count\u values()”不…只能计算字符串和整数值!那么,在你尝试计数之前,先将所有浮点数转换成字符串。谢谢你的回答,不过似乎有点问题。我没有在原始数组中检测到顺序或重复项。这就是我希望在那里找到的结果。没问题。有趣的是,我真的不确定会有什么不同-我不确定你是在我的答案中复制/粘贴代码还是手工写出来,但可能存在差异?我的第一个想法是对象不是通过引用传递的。。。注意:
foreach($objects as&$object)行中的&
{
。如果您想直接修改循环中的对象而不使用索引取消引用,这一点很重要。如果这不是问题,您可以发布您尝试过的代码,然后我们可以查看一下吗?不,当然我没有复制/粘贴它。但是原始数组没有顺序键。我仍然需要检测那些重复项。谢谢e更新。当您说“原始数组”时,您知道我的示例使用的是$objects
,这应该是您的原始数组,它不是您的值的副本或副本。您从mysql\u fetch\u object
返回的数组的名称是什么?很抱歉,它可以工作!!非常感谢!我将它标记为ans沃雷德。