解析和分组数据后将数组减少为两个元素

问题描述 投票:0回答:2

我对从数组中获取第一个和最后一个值有点困惑。我尝试使用

explode()
函数,但我的逻辑无法正常工作,而且逻辑非常愚蠢。

我的阵列

 Array
(
    [0] => 500 - 1112 
    [1] =>  1113 - 2224
    [2] => 2225 - 4446
    [3] => 4446 
)

我试过这个方法

$range = explode(',', $price_range);
$count = count($range);
if (1 == $count) {
    $price_1 = $range[0];
    $ranges['range1'] = explode(' - ', $price_1);
} else if (2 == $count) {
    $price_1 = $range[0];
    $price_2 = $range[1];
    $ranges['range1'] = explode(' - ', $price_1);
    $ranges['range2'] = explode(' - ', $price_2);
} else if (3 == $count) {
    $price_1 = $range[0];
    $price_2 = $range[1];
    $price_3 = $range[2];
    $ranges['range1'] = explode(' - ', $price_1);
    $ranges['range2'] = explode(' - ', $price_2);
    $ranges['range3'] = explode(' - ', $price_3);
} else if (4 == $count) {
    $price_1 = $range[0];
    $price_2 = $range[1];
    $price_3 = $range[2];
    $price_4 = $range[3];
    $ranges['range1'] = explode(' - ', $price_1);
    $ranges['range2'] = explode(' - ', $price_2);
    $ranges['range3'] = explode(' - ', $price_3);
    $ranges['range4'] = explode(' - ', $price_4);
}
$array = call_user_func_array('array_merge', $ranges);
sort($array);
$min = reset($array);
$max = end($array);

根据我的数组,我想要在数组中获取单个值,例如

Array
(
    [0] => 500 - 1112 
    [1] =>  1113 - 2224
    [2] => 2225 - 4446
    [3] => 4446 
)

所以我想转换这个数组,如下所示,

Array
(
    [0] => array(
        [0] => 500
        [1] => 1112 
        [2] => 1113 
        [3] => 2224
        [4] => 2225
        [5] => 4446
       )
    [1] => 4446 
)

并从该数组中获取

Array ( [0] => array(
的最小值和最大值。有没有简单的方法可以做到这一点?

php arrays multidimensional-array grouping dynamic-arrays
2个回答
0
投票

如果我正确理解你的示例,你为它提供了参数

$count
2

所以,这可能是我对您的请求的版本:

数据

<?php
$data[] = '500 - 1112';
$data[] = '1113 - 2224';
$data[] = '4446';

功能

<?php
function explodeRanges(array $data, $counter, $explode = '-') {
    $return = [];

    // We take the correct number of rows
    foreach( array_slice($data, 0, $counter) as $value ) {
        $return = array_merge(
            $return,
            array_map('trim', explode($explode, $value))
        );
        // trim() function mapped on each elements to clean the data (remove spaces)
        // explode all values by the separator
    }
    return $return;
}

输出

<?php
for( $i = 1 ; $i <= 4 ; $i++ ) {
    $range = explodeRanges($data, $i);

    echo 'For ', $i, ' => [', implode(', ', $range), ']; MIN = ', min($range), '; MAX = ', max($range);
    echo '<hr />';
}

...以及结果:)

For 1 => [500, 1112]; MIN = 500; MAX = 1112
For 2 => [500, 1112, 1113, 2224]; MIN = 500; MAX = 2224
For 3 => [500, 1112, 1113, 2224, 4446]; MIN = 500; MAX = 4446
For 4 => [500, 1112, 1113, 2224, 4446]; MIN = 500; MAX = 4446

如果您需要多次重复您的代码,那是因为您可以改进它。这里功能简单,速度很快。


0
投票

我不理解上下文/业务逻辑,但我无法提供脚本来提取、分组和展平该数据集。对于函数式编程,这是

array_reduce()
的工作。 要将数字解析为 int 类型值,请使用
sscanf()
,然后有条件地将提取的数据推入结果中。 演示

var_export(
    array_reduce(
        $array,
        function ($result, $v) {
            if (sscanf($v, '%d - %d', $ints[], $ints[]) === 2) {
                $result[0] ??= [];
                array_push($result[0], ...$ints);
            } else {
                $result[1] = $ints[0];
            }
            return $result;
        },
        []
    )
);

输出:

array (
  0 => 
  array (
    0 => 500,
    1 => 1112,
    2 => 1113,
    3 => 2224,
    4 => 2225,
    5 => 4446,
  ),
  1 => 4446,
)
© www.soinside.com 2019 - 2024. All rights reserved.