从一个大的阵列创建不同的范围阵列

时间:2012-11-01 01:09:23

标签: php arrays array-filter

我有一个数组,其中包含按字母表第一个字母分类的其他美国大学数组。我已经设置了一个测试页面,以便您可以使用print_r查看该数组。该页面是:

http://apps.richardmethod.com/Prehealth/Newpublic/test.php

为了创建该数组,我使用了以下代码:

    $alphabetized = array();

    foreach (range('A', 'Z') as $letter) {

            // create new array based on letter
            $alphabetized[$letter] = array();

            // loop through results and add to array
            foreach ( $users as $user ) {
                    $firstletter = substr($user->Schoolname, 0, 1);

                    if ( $letter == $firstletter ) {
                        array_unshift( $alphabetized[$letter], $user );
                    }
            }
    }

现在,我想分割数组,以便每个数组中都有一定范围的字母。例如,

arrayABCEFGH - 将包含以字母A,B,C,D,E,F,G和H开头的学校。

我的问题是,我应该修改上面的代码,以便在我执行一个大数组之前实现这一点,或者我应该在之后执行此操作吗?

这是一个大问题。 。如果是这样,怎么样? : - )

提前感谢您的帮助。非常感谢。

3 个答案:

答案 0 :(得分:0)

您可以编写一个简单的函数,它接受一个数组,以及一个从该数组中提取的键数组,并返回一个只包含这些键及其值的数组。一种array_slice非数字键:

function values_at($array, $keys) {
    return array_intersect_key($array, array_flip($keys));
}

然后您可以这样调用以从字母顺序列表中获得您想要的内容:

$arrayABCDEFGH = values_at($alphabetized, range('A','H'));

答案 1 :(得分:0)

如果您不需要数组的完整副本,那么您应该将上面的代码封装在一个以数组作为参数的函数($ letterRange)中,该函数将保存特定的数组标识符(字母)在最后的阵列中。

然后,您需要使用if块将代码封装在foreach中:

if (in_array($letter, $letterRange)) { ... }

这将导致一个数组只包含$ letterRange中指定字母的字母数组。

答案 2 :(得分:0)

首先,仅通过$users进行迭代,可以更轻松地生成数组的代码:

$alphabetized = array();

// loop through results and add to array
foreach ($users as $user) {
    $firstletter = strtoupper($user->Schoolname[0]);

    $alphabetized[$firstletter][] = $user;
}
// sort by first letter (optional)
ksort($alphabetized);

要检索前8个条目,您可以使用array_slice

array_slice($alphabetized, 0, 8);

假设实际使用了所有第一个字母,并且您在完整数组上使用了ksort(),这也使您从A - H中获得。否则您必须使用array_intersect_key()和您希望的翻转字母范围查询。

array_intersect_key($alphabetized, array_flip(range('A', 'H')));