PHP массив - ключ диапазона - PullRequest
1 голос
/ 19 апреля 2020

Я хотел бы создать массив с некоторыми ключами будет диапазон данных.

Пример :

$data = [
    1 => 1000,
    2 => 500,
    3 => 250,
    4 - 5 => 100,
    6 - 10 => 50,
    11 - 99 => 20
];

В этом случае $data[4] должно вернуть 100. $data[53] должно вернуть 20, et c.

Возможно ли это без ввода всего текста?

Спасибо

Ответы [ 4 ]

2 голосов
/ 19 апреля 2020

Использование array_fill():

<?php

$data = [
   1 => 1000,
   2 => 500,
   3 => 250
   ];

$a = array_fill(4,2, 100);
$b = array_fill(6,5, 50);
$c = array_fill(11,89, 20);

$data = $data + $a + $b + $c;

print_r($data);
1 голос
/ 19 апреля 2020

Наивный раствор без array_fill(). Эффективный способ памяти.

<?php

function array_search_key_range(int $needle, array $haystack)
{
    foreach ($haystack as $range => $value) {
        [$min, $max] = array_map('intval', explode('-', (string)$range, 2) + [1 => $range]);
        if ($min <= $needle && $needle <= $max) {
            return $value;
        }
    }

    return false;
}

$data = [
    1 => 1000,
    2 => 500,
    3 => 250,
    '4-5' => 100,
    '6-10' => 50,
    '11-99' => 20,
];

var_dump(array_search_key_range(2, $data)); // 500
var_dump(array_search_key_range(4, $data)); // 100
var_dump(array_search_key_range(10, $data)); // 50
var_dump(array_search_key_range(98, $data)); // 20
var_dump(array_search_key_range(120, $data)); // false
0 голосов
/ 19 апреля 2020
<?php
$data = [
    '1' => 1000,
    '2' => 500,
    '3' => 250,
    '4-5' => 100,
    '6-10' => 50,
    '11-99' => 20];

//Create a new array ($range_arr where you
//create a key for every item in the range specified by your key
//in your $data array
$range_arr = [];
foreach(array_keys($data) as $key) {
    $exploded_key = explode('-', $key);
    $start_range = $exploded_key[0];
    $end_range = $start_range;
    if (isset($exploded_key[1])) {
        $end_range = $exploded_key[1];
    }
    foreach(range($start_range,$end_range) as $nr) {
        $range_arr[$nr] = $data[$key];
    }
}

//for example will output 50
echo $range_arr[7];
0 голосов
/ 19 апреля 2020

Ну,
немного неуклюже, но вы могли бы рассмотреть следующее:

$data = array_merge([
        0 => null,
        1 => 1000,
        2 => 500,
        3 => 250,
    ],
    array_map(function(){ return 100;}, range(4,5)),
    array_map(function(){ return 50;}, range(6,10)),
    array_map(function(){ return 20;}, range(11,99))
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...