Php 过滤器和重新索引数组

Php 过滤器和重新索引数组,php,Php,我正在尝试筛选和重新索引此数组。我的原始数组是$\u SESSION['ShowingRequests']。 我试过了 array_values(array_filter($_SESSION['ShowingRequests'])) 及 但它不会到达阵列的第二级。 我想从这里开始 Array ( [ListingKey] => Array ( [1] => 97826889139 [2] => 97820

我正在尝试筛选和重新索引此数组。我的原始数组是$\u SESSION['ShowingRequests']。
我试过了

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

但它不会到达阵列的第二级。 我想从这里开始

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
        )
)

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

foreach (['ListingKey', 'Key'] as $key) 
{
    $_SESSION['ShowingRequests'][$key] = array_values(
        array_filter($_SESSION['ShowingRequests'][$key])
    );
}
这里演示了它如何与助手函数一起工作,以使其更加可见

下面是一个没有helper函数但使用别名的示例,我原以为该别名可能更容易理解,但显然不是:

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

此示例代码使用要更改的变量的别名(此处为要更改的数组部分)。这可能会使它的工作方式更加明显。由于它是一个别名,
unset
用于删除别名,因此不应在下一次迭代中或迭代完成后重新使用它。

PHP数组没有索引,因为它们不是真正的数组。它们实际上是有序的hashmap,因此您不应该真正关心这里的键。迭代这些数组非常简单,根本不需要使用
array\u值

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

        1 => 97826889139
        2 => 97820967049
        4 => 97825243774
        5 => 97824864611
其中,使用构造获取键的名称和数组中每个元素的值

无论如何,你必须记住和都是非破坏性功能。它们返回一个新数组。它们不会通过引用修改数组。因此,如果要修改现有数组,必须指定返回值。它们也不会递归地工作

$_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']));

还有什么不适合你?您的代码看起来并不遥远。值得一提的是,这是一个非常糟糕的问题解决方案,因为您通过引用分配了$\u会话['ShowingRequests'][$key],只是为了完全放弃引用并通过值重新分配。基本上,您采取了一个不必要的步骤,实际上会导致更多的混乱和潜在的错误。删除行
$var=&$\u会话['ShowingRequests'][$key]
并将其他两行替换为
$\u会话['ShowingRequests'][$key]=array\u值(array\u过滤器($\u会话['ShowingRequests'][$key])实际上做了正确的事情。@GoogleGuy:引用没有被丢弃。别名一直使用到
取消设置
。你可能是对的,对于那些不认为Alias但是Reference可能会把它和其他东西混在一起的人来说,这很难理解。我也会制作另一个版本。不,它被丢弃:)我也不知道你所说的别名是什么意思,因为你所拥有的绝对是一个引用,它也没有任何意义,因为你的代码完全按照你所希望的那样做,而没有不必要的错误引用:)请参阅了解PHP中引用的更多信息。大多数人对引用在PHP中的作用以及为什么要使用它们有着强烈的误解。我认为它们的用例是如此罕见,以至于在8年的PHP生涯中,我想我用过一次:)@GoogleGuy:我只是用它们给每个数组条目加了一个标签。如果你问我的话,那很好。老实说,我没有看到任何误解。哦,我不是说你的代码不起作用。我是说你在那里使用引用是不必要的。因此,关于引用的作用的误解。你不需要引用来做你想做的事情。正如你所看到的,
foreach($\u SESSION['ShowingRequests']as$key=>$value)$\u会话['ShowingRequests'][$key]=array\u值(array\u filter($value));
完全执行您想要的操作,无需引用:)如果您从
$\u会话['ShowingRequests']
中删除键,请干杯(如最后一个代码块的第一行),接下来的两行再也找不到这些键了。你是对的,应该用另一种方法来处理。将解决这个问题,谢谢:)如果你用另一种方法来处理,你仍然会破坏它。我只会跳过(以前的第一行)。分配返回值是我所缺少的。而且,仅$\u会话不起作用['ShowingRequests'].必须为每个$\u会话['ShowingRequests']['ListingKey']和$\u会话['ShowingRequests']['Key']分配值。感谢GoogleguyWell,在
$\u会话['ShowingRequests']
上使用它只意味着你丢失了那些非数字键(即
ListingKey
Key
),它们分别变为0和1。
        1 => 97826889139
        2 => 97820967049
        4 => 97825243774
        5 => 97824864611
$_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']));