php-yield生成器

function createRange($number){
    for($i=0;$i<$number;$i++){
        yield time();
    }
}

$result = createRange(5); // 这里调用上面我们创建的函数

var_dump($result);
foreach($result as $value){
    sleep(1);
    echo $value.'<br />';
}


//对某一数组进行加权处理
$numbers = array('nike' => 200, 'jordan' => 500, 'adiads' => 800);

//通常方法,如果是百万级别的访问量,这种方法会占用极大内存
function rand_weight($numbers)
{
    $total = 0;
    foreach ($numbers as $number => $weight) {
        $total += $weight;
        $distribution[$number] = $total;
    }
    $rand = mt_rand(0, $total-1);

    foreach ($distribution as $num => $weight) {
        if ($rand < $weight) return $num;
    }
}

//改用yield生成器
function mt_rand_weight($numbers) {
    $total = 0;
    foreach ($numbers as $number => $weight) {
        $total += $weight;
        yield $number => $total;
    }
}

function mt_rand_generator($numbers)
{
    $total = array_sum($numbers);
    $rand = mt_rand(0, $total -1);
    foreach (mt_rand_weight($numbers) as $num => $weight) {
        if ($rand < $weight) return $num;
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
PHP 中,`yield` 是一个非常强大的关键字,可以用于创建生成器函数。生成器函数的特点是可以在执行过程中暂停,然后在需要时继续执行。这种机制可以大大节省内存,特别是在处理大量数据时。 `yield from` 是 PHP 5.5 引入的新特性,可以将一个生成器中的值传递给另一个生成器,并且将其作为子生成器。这种机制可以让我们将生成器的代码分解成更小的部分,使得代码更加清晰和易于维护。 下面我们来看一个例子: ```php function generator1() { yield 'a'; yield 'b'; yield 'c'; } function generator2() { yield from generator1(); yield 'd'; yield 'e'; } foreach(generator2() as $value) { echo $value . "\n"; } ``` 在上面的例子中,我们定义了两个生成器函数 `generator1` 和 `generator2`,其中 `generator2` 中使用了 `yield from` 将 `generator1` 作为子生成器来使用,并在后面添加了一些额外的值。 最后我们使用 `foreach` 循环遍历 `generator2` 生成的值,并输出每个值。运行上面的代码,输出结果如下: ``` a b c d e ``` 从输出结果可以看出,`yield from` 机制使得我们可以将生成器的代码拆分成更小的部分,使得代码更加清晰和易于维护。 除了将一个生成器作为子生成器之外,`yield from` 还可以用于数组和可迭代对象。例如: ```php function generator3() { yield from [1, 2, 3]; yield from new ArrayIterator([4, 5, 6]); } foreach(generator3() as $value) { echo $value . "\n"; } ``` 在上面的例子中,我们使用了 `yield from` 将数组和可迭代对象转化成了生成器,并将它们的值依次生成出来。 总结一下,`yield from` 是 PHP 中非常有用的一个特性,可以将多个生成器、数组、可迭代对象等合并成一个生成器,使得代码更加简洁和易于维护。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奇葩也是花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值