【问题标题】:count() not returning correct number of array elementscount() 没有返回正确数量的数组元素
【发布时间】:2011-12-02 01:23:46
【问题描述】:

我有两个要合并的数组(从数据库查询返回的记录)。然后我需要计算组合数组中元素的数量。

下面是两个原始数组的 print_r 结果:

Array(
    [0] => stdClass Object([id] => 25590)
    [1] => stdClass Object([id] => 40657)
    [2] => stdClass Object([id] => 60685)
    [3] => stdClass Object([id] => 61900)
    [4] => stdClass Object([id] => 65224)
)

Array(
    [0] => stdClass Object([id] => 88406)
)

这样创建的合并数组:

$licensed_users = array_unique(array_merge($lu, $lu2));

以及合并的结果(在这种情况下没有任何重复,但可能有,因此是 array_unique)

Array(
    [0] => stdClass Object([id] => 25590)
    [1] => stdClass Object([id] => 40657)
    [2] => stdClass Object([id] => 60685)
    [3] => stdClass Object([id] => 61900)
    [4] => stdClass Object([id] => 65224)
    [5] => stdClass Object([id] => 88406)
)

该数组被分配给一个会话变量,以便在另一个页面上使用:

    $_SESSION['licensed_users'] = $licensed_users;

我现在想通过会话变量知道合并数组中有多少元素。

count($_SESSION['licensed_users'])

我希望它返回 6。相反,它返回 1。知道为什么吗?

编辑为@SURREALDREAMS 添加代码

$_SESSION['licensed_users'] = array_unique(array_merge($lu, $lu2));
print_r($lu);
print_r($lu2);
print_r($_SESSION['licensed_users']);
echo "there are ". count($_SESSION['licensed_users']) . " licensed users";

此代码返回以下内容:

$lu Array(
    [0] => stdClass Object([id] => 25590)
    [1] => stdClass Object([id] => 40657)
    [2] => stdClass Object([id] => 60685)
    [3] => stdClass Object([id] => 61900)
    [4] => stdClass Object([id] => 65224)
)

$lu2 Array(
    [0] => stdClass Object([id] => 88406)
)

$_SESSION['licensed_users'] Array(
    [0] => stdClass Object([id] => 25590)
)

回显行返回 1。

如果我按照您建议的方式尝试:

$licensed_users = array_unique(array_merge($lu, $lu2));
$_SESSION['licensed_users'] = $licensed_users;
echo "there are ". count($_SESSION['licensed_users'], COUNT_RECURSIVE) -1 . " licensed users";

返回的数组内容相同,但回显行返回-1。

【问题讨论】:

  • var_dump($licensed_users) 显示什么?
  • 很奇怪如何将唯一的合并数组分配给会话变量,数组中只有 1 个条目。尝试放弃 array_unique() 函数,看看会发生什么。
  • @SurrealDreams - 删除 array_unique() 确实给了我正确的计数在这种情况下。但正如我在原帖中所说,有些情况下会有重复,需要从最终数组中删除。遍历数组并比较每个元素的开销太高 - 该示例只有一个小数组,但实际上可能有数千个元素。

标签: php arrays


【解决方案1】:

它正在计算 $_SESSION['licensed_users'] 的内容,即 1 - 您的 $licensed_users 数组。你可以试试:

count($_SESSION['licensed_users'], COUNT_RECURSIVE);

这将返回 7。您可以了解自己的结构并使用它:

count($_SESSION['licensed_users'], COUNT_RECURSIVE) -1;

返回预期的 6。

为了简化一点,考虑一下:

$_SESSION['licensed_users'] = array_unique(array_merge($lu, $lu2));

那么count($_SESSION['licensed_users']; 应该返回 6。

【讨论】:

  • 不,我试过你的简化版本,它仍然返回 1。而你的另一个版本返回的东西更奇怪。我正在更新 OP 以显示我尝试过的内容和返回的内容。
【解决方案2】:

问题出在array_unique() 电话中。来自文档:

Two elements are considered equal if and only if (string) $elem1 === (string) $elem2. In words: when the string representation is the same.

这些对象在比较之前被转换为字符串。您可能必须根据其他一些属性手动修剪它们。

【讨论】:

  • 嗯。我真的不想遍历数组,对每个元素运行条件,基本上从头开始重建它们。有没有办法将对象数组转换为字符串数组? (即现有功能)
  • 当然,使用array_map()。您为数组中的每个元素定义回调函数,因此您基本上可以对每个对象做任何您想做的事情。我不太了解您使用的是什么对象,但您总是可以执行以下操作:$as_str = array_map( function($elem) { return $elem->asString(); }, $the_array);。我不会太担心遍历数组并使用条件。这基本上就是array_unique() 在后台所做的事情。
  • 这似乎有点费力。数组由使用 ezSQL 的查询返回;我想知道是否有一些我可以在查询调用中使用的参数,它只会返回一个字符串数组而不是一个对象数组。
  • 给你答案标志,因为你的 cmets 提示我找到实际答案。事实证明,如果您只从表中返回一列,ezSQL 中有一个函数将返回一维字符串数组。我们显然没有最新的文档,所以直到我去寻找时才知道。
【解决方案3】:
<?
$my_array = array(0 => 1, 1 => 2, 2 => 3, 3 => 4, 4 => 5);

$your_array = array(0 => 1, 1 => 2);

$the_array = array_unique(array_merge($my_array, $your_array)); 

$_SESSION['test'] = $the_array;

print_r($the_array);

echo(count($_SESSION['test']));
?>

产量:

数组 ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) 5

<?
$my_array = array(0 => 1, 1 => 1, 2 => 1, 3 => 1, 4 => 1);

$your_array = array(0 => 1, 1 => 1);

$the_array = array_unique(array_merge($my_array, $your_array)); 

$_SESSION['test'] = $the_array;

print_r($the_array);

echo(count($_SESSION['test']));
?>

产量:

数组 ( [0] => 1 ) 1

我的猜测是你的 stdClass Object([id] => xxxxx) 都是一样的...

编辑

另一个测试:

<?
$my_array = array(0 => array('id' => 11), 1 => array('id' => 22), 
                  2 => array('id' => 22), 3 => array('id' => 33), 4 => array('id' => 445));

$your_array = array(0 => array('id' => 11), 1 => array('id' => 7908));

$the_array = array_unique(array_merge($my_array, $your_array), SORT_REGULAR); 

$_SESSION['test'] = $the_array;

print_r($the_array);

echo(count($_SESSION['test']));
?>

产量:

数组 ( [0] => 数组 ( [id] => 11 ) [1] => 数组 ( [id] => 22 ) [3] => 数组 ( [id] => 33 ) [4] => 数组 ( [id] => 445 ) [6] => 数组 ( [id] => 7908 ) ) 5

我想这就是你要找的。​​p>

【讨论】:

  • 对不起,我不知道你想在这里说明什么。我发布了数组的 print_r 结果; ID 并不完全相同。
  • 基本上他想要展示的是 array_unique() 函数只检查数组中项目的值。仅仅拥有不同的密钥是不够的。对于array_unique()array(0 =&gt; 'apple')array('banana' =&gt; 'apple') 完全相同。
  • 我的猜测是 PHP 看不出你所有的 stdClass Object([id] => nnnnn) 之间有什么区别
猜你喜欢
  • 1970-01-01
  • 2017-02-05
  • 2019-02-19
  • 2016-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多