【问题标题】:Filter and reindex array [duplicate]过滤和重新索引数组[重复]
【发布时间】:2012-12-21 17:31:21
【问题描述】:

我正在尝试过滤和重新索引这个数组。我的原始数组是 $_SESSION['ShowingRequests']。
我试过了

array_values(array_filter($_SESSION['ShowingRequests']))

array_values(array_filter($_SESSION['ShowingRequests']['ListingKey']))
array_values(array_filter($_SESSION['ShowingRequests']['Key']))

但它不会到达数组的第二层。 我希望它从此开始

Array
(
    [ListingKey] => Array
        (
            [1] => 97826889139
            [2] => 97820967049
            [4] => 97825243774
            [5] => 97824864611
        )
    [Key] => Array
        (
            [1] => 2
            [2] => 3
            [4] => 5
            [5] => 6
        )
)

到这里

Array
(
    [ListingKey] => Array
        (
            [0] => 97826889139
            [1] => 97820967049
            [2] => 97825243774
            [3] => 97824864611
        )
    [Key] => Array
        (
            [0] => 2
            [1] => 3
            [2] => 5
            [3] => 6
        )
)

【问题讨论】:

  • 什么对你不起作用?您的代码看起来并不遥远。

标签: php


【解决方案1】:

PHP 数组没有索引,因为它们不是真正的数组。它们实际上是有序的哈希图,因此您不应该真正关心这里的键。遍历这些数组很简单,根本不需要使用array_values

foreach ($_SESSION['ShowingRequests']['ListingKey'] as $key => $value) {
    echo "$key => $value\n";
}

会给你...

        1 => 97826889139
        2 => 97820967049
        4 => 97825243774
        5 => 97824864611

您可以使用foreach 构造获取数组中每个元素的键名和值。

无论如何,您必须记住array_valuesarray_filter 都是非破坏性函数。他们返回一个新数组。它们不会通过引用来修改数组。因此,如果要修改现有数组,则必须分配返回值。它们也不能递归工作。

$_SESSION['ShowingRequests']['ListingKey'] = array_values(array_filter($_SESSION['ShowingRequests']['ListingKey']));
$_SESSION['ShowingRequests']['Key'] = array_values(array_filter($_SESSION['ShowingRequests']['Key']));
$_SESSION['ShowingRequests'] = array_values(array_filter($_SESSION['ShowingRequests']));

【讨论】:

  • 如果您从$_SESSION['ShowingRequests'] 中删除键(如在最后一个代码块的第一行中),接下来的两行将不再找到这些键。
  • 你是对的,应该反过来做。会解决的,谢谢:)
  • 如果你反其道而行之,你仍然会破坏它。我只是跳过(以前的第一行)。
  • 分配返回值是我所缺少的。此外,不适用于 $_SESSION['ShowingRequests']。必须为每个 $_SESSION['ShowingRequests']['ListingKey'] 和 $_SESSION['ShowingRequests']['Key'] 分配值。谢谢 Googleguy
  • 好吧,在$_SESSION['ShowingRequests'] 上使用它意味着您丢失了那些非数字键(即ListingKeyKey),它们分别变为0 和1。
【解决方案2】:

您的问题是将过滤后的值分配回同一个键吗?

foreach (['ListingKey', 'Key'] as $key) 
{
    $_SESSION['ShowingRequests'][$key] = array_values(
        array_filter($_SESSION['ShowingRequests'][$key])
    );
}

这里有一些演示它是如何与辅助函数一起工作的,只是为了让它更可见

function array_filter_values($var) {
    return array_values(array_filter($var));
}

foreach (['ListingKey', 'Key'] as $key) 
{
    $_SESSION['ShowingRequests'][$key] = 
        array_filter_values($_SESSION['ShowingRequests'][$key])
    ;
}

这是一个没有那个辅助函数但有一个别名的例子,我认为它可能更容易理解,但显然不是:

foreach (['ListingKey', 'Key'] as $key) 
{
    $var = &$_SESSION['ShowingRequests'][$key];
    $var = array_values(array_filter($var));
    unset($var);
}

此示例代码使用 别名 来表示您要更改的变量(这里是您要更改的数组部分)。这可能使它更容易看到它是如何工作的。因为是别名,unset是用来去掉别名的,下次迭代或者迭代结束后不要再使用了。

【讨论】:

  • 对于它的价值,这是一个非常糟糕的问题解决方案,因为您仅通过引用分配 $_SESSION['ShowingRequests'][$key] 以完全丢弃引用并按值重新分配。基本上,您采取了不必要的步骤,实际上会导致更多的混乱和错误的可能性。删除$var = &$_SESSION['ShowingRequests'][$key]; 行并用$_SESSION['ShowingRequests'][$key] = array_values(array_filter($_SESSION['ShowingRequests'][$key])); 替换其他两行实际上是正确的。
  • @GoogleGuy:引用未被丢弃。别名一直使用到unset。请参阅eval.in/6110 - 对于那些不认为 AliasReference 可能将其与其他事物混合然后很难理解的人来说,您可能是对的。我也会制作另一个版本。
  • 不,它被丢弃了 :) 我也不知道你所说的 Alias 是什么意思,因为你所拥有的绝对是一个 Reference 而且它也是没有任何意义,因为您的代码完全按照您想要的方式执行,而没有不必要和错误地使用引用:) 有关 PHP 中引用的更多信息,请参阅php.net/references。大多数人对引用在 PHP 中的作用以及为什么要使用它们有很大的误解。我认为它们的用例非常罕见,以至于在 8 年的 PHP 中我想我用过一次 :)
  • @GoogleGuy:我只是使用它们给每个数组条目另一个标签。如果你问我,那就太好了。老实说,我没有看到任何误解。
  • 哦,我并不是说您的代码不起作用。我建议您在此处使用引用是不必要的。因此对引用的作用存在误解。您不需要引用在那里做你想做的事。如你所见,foreach($_SESSION['ShowingRequests'] as $key => $value) $_SESSION['ShowingRequests'][$key] = array_values(array_filter($value)); 完全按照你的意愿做,没有参考:) 干杯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 2017-09-13
  • 2012-05-18
  • 2017-08-03
  • 2021-07-01
  • 2011-11-25
  • 1970-01-01
相关资源
最近更新 更多