【问题标题】:array_push & array_udiff with custom class objects带有自定义类对象的 array_push 和 array_udiff
【发布时间】:2014-11-14 17:55:37
【问题描述】:

我将类对象推送到两个不同的数组上,然后想要获取这些数组中的不同。但是,当我将数组推送与 array_udiff 一起使用时,我无法让 array_udiff 输出除 null 之外的任何内容。这是代码的准系统。

类定义:

class follower
{
    public $friend;
    public $newposts;

    }

数据赋值:for循环包含:

        $holder = new follower();
....put data in $holder....
        array_push($object_array1, $holder);

第二个for循环做同样的事情......

       $holder = new follower();
....put data in $holder....
    array_push($object_array2, $holder);

比较对象数组中的对象的功能:

function compare_followers($f1, $f2)
{
    $s1 = $f1->friend;
    $s2 = $f2->friend;
    return strcmp($s1, $s2);
}

最后尝试比较这两个数组没有成功(数组看起来应该是,跟随者对象的数组)

$object_array = array_udiff($object_array2, $object_array1, 'compare_followers');

$object_array 为空。除了上面的代码之外,我还尝试使用比较函数——将其设为类中的静态函数或在 array_udiff 调用中将其声明为未命名函数,但这些都不起作用。

如果我将 compare_followers 应用于个别班级成员,那效果很好。同样,如果我将以下对象推送到我的 $object_array1 和 $object_array2 上,array_udiff 工作正常:

    $holderA = array(
            'friend' =>$holder->friend,
            'newposts' => $holder->newposts
            );

        array_push($object_array2, $holder); (and same for $object_array1)

$object_array = array_udiff($object_array2, $object_array1, 'compare_followers');

后一种工作方法的问题在于它提供了一个对象字典而不是一个对象数组——我需要一个数组。

以下是一些相关但未解决的 stackoverflow 问题:array_udiff not working as expectedHow does array_udiff() work?array intersect for object array php。 这是此类的文档 (http://php.net/manual/en/function.array-udiff.php

我做错了什么?

感谢您的任何建议。

【问题讨论】:

  • 你试过调试你的compare_followers函数吗?尝试输出$f1$f2$s1$s2 和 strcmp($s1, $s2) 的输出,并确保它返回一个对array_udiff有意义的值
  • 嗨 Nico,是的,我已经这样做了。我可以比较数组的元素以及各个跟随者对象,并且输出应该是这样的。另外,为了简单起见,我还尝试让 compare_followers 始终返回 1 或始终返回 0,但在我上面的代码中,array_udiff 的输出始终为 nil。

标签: php arrays class dynamic-arrays


【解决方案1】:

试试这个。注意数组实际包含的内容。

<?php

class follower {
    public $friend;
    public $newposts;

    public function __construct($friend, $newpost) {
        $this->friend = $friend;
        $this->newposts = $newpost;
    }
}

$object_array1 = array();
$holder = new follower('me', 'first');
array_push($object_array1, $holder);

$object_array2 = array();
$holder = new follower('you', 'second');
array_push($object_array2, $holder);

function compare_followers($f1, $f2) {
    $s1 = $f1->friend;
    $s2 = $f2->friend;
    return strcmp($s1, $s2);
}

$object_array = array_udiff($object_array2, $object_array1, 'compare_followers');

var_dump($object_array);

【讨论】:

  • 谢谢!所以它不再为空,但格式仍然与 json 编码时的原始数组不太一样。这是数组推送的结果 - 对象/字典数组:[{"friend":"brooklynsage","newposts":null},{"friend":"jackR","newposts":null},.. .etc 而在使用您的语法的 array_udiff 之后,我仍然有一个字典/对象字典:{"12":{"friend":"jonjon","newposts":null},"14":{"friend": "laylaohio2","newposts":null}}...
  • json_encode 仅在键为 int 且有序时返回数组 []。这意味着 array(0=>'val',1=>'val') 将给出数组。但 array(0=>'val',2=>'val') 不会。 Assoc 数组也不会给出数组
  • 知道了。再次感谢!
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
相关资源
最近更新 更多