PHP检测非字符串重复项,并将其按出现顺序添加到数组中

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] =>

我有一个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] => 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沃雷德。