过滤和重新索引数组

时间:2013-01-07 22:30:18

标签: php

我正在尝试过滤并重新索引此数组。我原来的数组是$ _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
        )
)

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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用于删除别名,所以不应在下一次迭代中或迭代完成后重复使用它。