Php 显示数组中元素的特定范围

Php 显示数组中元素的特定范围,php,arrays,Php,Arrays,我有一个如下所示的数组: Array ( [100] => Array ( [user_id] => 100 [nest] => Array ( ) ) [200] => Array ( [user_id] => 200 [nest] =&g

我有一个如下所示的数组:

Array
(
    [100] => Array
        (
            [user_id] => 100
            [nest] => Array
                (
                )

        )

    [200] => Array
        (
            [user_id] => 200
            [nest] => Array
                (
                    [300] => Array
                        (
                            [user_id] => 300
                            [nest] => Array
                                (
                                )

                        )

                    [400] => Array
                        (
                            [user_id] => 400
                            [nest] => Array
                                (
                                )

                        )

                    [500] => Array
                        (
                            [user_id] => 500
                            [nest] => Array
                                (
                                )

                        )

                )

        )

    [600] => Array
        (
            [user_id] => 600
            [nest] => Array
                (
                )

        )

    [700] => Array
        (
            [user_id] => 700
            [nest] => Array
                (
                )

        )

    [800] => Array
        (
            [user_id] => 800
            [nest] => Array
                (
                )

        )

    [900] => Array
        (
            [user_id] => 900
            [nest] => Array
                (
                )

        )

)
function flatten(array $array) {
  $return = array();
  array_walk_recursive($array, function($a) use (&$return) { $return[] = $a; });
  return $return;
}
我希望一次只能显示5个元素。如何生成一个函数,该函数接受一个范围(
1-5
5-10
等),并显示数组中元素的范围

例如,范围
1-5
将仅显示数组中的元素
100、200、300、400和500
。范围
5-10
将显示元素
500、600、700、800和900


谢谢大家!

如果我的解释正确,看起来您需要首先展平数组,然后数组\u切片将按您希望的方式工作

具体来说,是这样的:

Array
(
    [100] => Array
        (
            [user_id] => 100
            [nest] => Array
                (
                )

        )

    [200] => Array
        (
            [user_id] => 200
            [nest] => Array
                (
                    [300] => Array
                        (
                            [user_id] => 300
                            [nest] => Array
                                (
                                )

                        )

                    [400] => Array
                        (
                            [user_id] => 400
                            [nest] => Array
                                (
                                )

                        )

                    [500] => Array
                        (
                            [user_id] => 500
                            [nest] => Array
                                (
                                )

                        )

                )

        )

    [600] => Array
        (
            [user_id] => 600
            [nest] => Array
                (
                )

        )

    [700] => Array
        (
            [user_id] => 700
            [nest] => Array
                (
                )

        )

    [800] => Array
        (
            [user_id] => 800
            [nest] => Array
                (
                )

        )

    [900] => Array
        (
            [user_id] => 900
            [nest] => Array
                (
                )

        )

)
function flatten(array $array) {
  $return = array();
  array_walk_recursive($array, function($a) use (&$return) { $return[] = $a; });
  return $return;
}
摘自

这里你是我的朋友

function customSlice(array $a, $iStartRange, $iEndRange) {
    $aRange = range($iStartRange, $iEndRange);
    $oIt    = new RecursiveIteratorIterator(
                  new RecursiveArrayIterator($a),
                  RecursiveIteratorIterator::SELF_FIRST);

    $aResult = array();
    foreach($oIt as $name => $element)
        if(in_array($name, $aRange))
            $aResult[$name] = $element;

    return $aResult;
}
示例

$aExample = array(
    100 => array('user_id' => 100, 'nest' => array()),
    200 => array('user_id' => 200, 'nest' => array(
        300 => array('user_id' => 300, 'nest' => array()),
        400 => array('user_id' => 400, 'nest' => array()),
        500 => array('user_id' => 500, 'nest' => array())
    )),
    600 => array('user_id' => 600, 'nest' => array()),
    700 => array('user_id' => 700, 'nest' => array()),
    800 => array('user_id' => 800, 'nest' => array()),
    900 => array('user_id' => 900, 'nest' => array())
);

$aSliced = customSlice($aExample, 100, 500);

与我的第一个答案有些不同,但可能更接近OP的目标。此函数用于展平阵列,并从展平透视图进行切片。它在线进行切片,而不是在展平之后。另外,我已经注释掉了,但包含了代码,以去除结果中的
'nest'
元素,否则可能会有大量冗余数据。最后,我对这一点做了一些体面的评论。享受吧

/**
 * Slice any array based on flattened perspective.
 * @param array $a Array to slice
 * @param int $iStartRange Starting index to slice (inclusive)
 * @param int $iEndRange Ending index to slice (inclusive)
 * Return array Sliced subset of input array.
 */
function recursive_array_slice(array $a, $iStartRange, $iEndRange)
{
    // Flatten out the inbound array
    $oIt = new RecursiveIteratorIterator(
               new RecursiveArrayIterator($a),
               RecursiveIteratorIterator::SELF_FIRST);

    $aResult = array(); // The sliced result
    $i       = 1;       // Track which element we're on
    foreach($oIt as $name => $element) {
        // Not a very rigorous check, but this filters
        // candidates down to ones we're likely looking for
        if(!is_int($name))
            continue;

        // If the current element is in the range of
        // interest, include it in the results
        if($i >= $iStartRange && $i <= $iEndRange) {
            $aResult[$name] = $element;
            // Optional if you don't want a ton of redundant
            // data in the results
            // unset($aResult[$name]['nest']);
        }   

        // Increment the count of the current element
        $i++;

        // Bail if we've gone past the range of interest
        if($i > $iEndRange)
            break;
    }

    return $aResult;
}
/**
*基于展平透视图对任意数组进行切片。
*@param array$要切片的数组
*@param int$iStartRange开始索引到切片(包括)
*@param int$iEndRange结束索引到切片(包括)
*返回输入数组的数组切片子集。
*/
函数递归数组切片(数组$a、$iStartRange、$iEndRange)
{
//展平入站阵列
$oIt=新的递归迭代器(
新的递归数组迭代器($a),
递归迭代器::SELF_优先);
$aResult=array();//切片结果
$i=1;//跟踪我们所在的元素
foreach($oIt as$name=>$element){
//不是一个非常严格的检查,但这个过滤器
//从候选人到我们可能正在寻找的人
如果(!is_int($name))
继续;
//如果当前元素在
//兴趣,包括在结果中
如果($i>=$iStartRange&&i$iEndRange)
打破
}
返回$aResult;
}

@quickshiftin,如果我没有弄错的话,它似乎只适用于顶级元素?执行
array\u slice($array,0,2)
显示元素
100
200
以及其中的每个元素,而不是仅显示元素
100
200
。如果您只想显示顶级元素,则需要以某种方式手动取出其子元素。但是,由于元素本身就是数组,因此在顶层没有太多价值。也许你想要的就是在
数组\u切片
之后从第二层用核弹炸“嵌套”元素?不,我不想只显示顶级元素。“例如,范围1-5将仅显示数组中的元素
100、200、300、400和500
。范围5-10将显示元素
500、600、700、800和900
array\u slice
返回嵌套元素,您尝试过吗?抱歉,我误读了您对我第一条评论的回复。您能解释一下
100*$iRange
部分的作用吗?您的键是100、200等,而不是1、2等。这只是一个简单的映射。核心代码在这里为您提供,您应该能够根据自己的需要对其进行调整。我应该提到,每次密钥都可以完全不同(它们是从数据库中获取的用户ID):/然后您可以使用
$aRange=range($iStartRange,$iEndRange)
而不是第一个
foreach
;我会修改答案。你确定这样行吗?我尝试了
customSlice($array,0,5)
,但它只返回1个结果。你能告诉我你是怎么做的吗?说得好,我花了一些时间才明白OP到底想要什么lol。