如何从数组输出不同的值

时间:2019-12-06 04:09:59

标签: php arrays for-loop variables arraylist

我的代码有问题。我想要做的是在调用数组时删除数组中的一项,这意味着我希望每个输出都不同。我想使用它来旋转代理,并且阵列中有150多个代理。这是我的代码示例。


for ( $i = 1; $i < 2; $i++ )
{
  // If the array_history is empty, re-populate it.
  if (empty($array_history))
    $array_history = $array;

  // Select a random key.
  $key = array_rand($array_history, 1);

  // Save the record in $selected.
  $selected = $array_history[$key];

  // Remove the key/pair from the array.
  unset($array_history[$key]);

  // Echo the selected value.
  echo $selected; 
}

如何执行此操作,或者for循环不适合此操作?预先感谢。

4 个答案:

答案 0 :(得分:1)

您想要做的是将访问权限分散到150个代理中。在这种情况下,实际上并不需要随机进行。您只需遍历数组即可。

<?php 

$array = [0, 1, 2, 3, 4, 5, 6];

for ( $i = 1; $i < 20; $i++ )
{
    echo getNext($array) . '<br>';
}

function getNext (&$array) {
  $e = next($array); // Every time next element is selected. Each output is different.
  if ($e)
    return $e;
  else 
    return reset($array);
}

?>

答案 1 :(得分:0)

当您在php中定义数组时,例如

<?php
$alphabet = array(a, b, c)
?> 

您尝试在数组中查找元素。元素列表始终从0开始计数。因此要调用单个元素从0开始从左到右计数。

<?php
#a
echo $alphabet[0];

#b
echo $alphabet[1];

#c
echo $alphabet[2]; 

?> 

由于没有中断,以上部分应产生abc的结果。

For循环非常适合遍历整个数组并运行检查,错误分析甚至数学运算。

答案 2 :(得分:0)

我已经稍作改动,对我来说,它看起来像是代码,它将选择一个项目,随机选择一个项目,丢弃该项目,然后再次选择直到没有剩余为止。如果没有剩余,请复制原始数组,然后重新开始。

当前,您的代码循环一次。我在这里将循环扩展到4个iteraton。并且在每次随机选择时,都会将该随机密钥存储在历史记录数组中。然后,您可以稍后在代码中引用该历史记录。

<?php
$array = 
[
    'beatle' => 'John',
    'stone' => 'Mick',
    'floyd' => 'Syd'
];

for ($history = [], $i = 1; $i < 5; $i++)
{
  if (empty($buffer))
    $buffer = $array;

  $key = array_rand($buffer, 1);
  $history[] = $key;

  echo $buffer[$key], "\n";

  unset($buffer[$key]);
}

var_export($history);

示例输出:

Syd
Mick
John
Syd
array (
  0 => 'floyd',
  1 => 'stone',
  2 => 'beatle',
  3 => 'floyd',
)

请参阅上面的历史记录数组:

echo $array[$history[3]];

将输出Syd

将以上内容适配并封装在一个类中。这将执行相同的操作(但不存储选择的历史记录),从数组中随机取出一项,然后删除直到数组中没有更多项,然后补充列表,依此类推:

class RandomProxies
{
    const PROXIES = 
    [
        'proxy1' => 'foo.example.com',
        'proxy2' => 'bar.example.com',
        'proxy3' => 'baz.example.com',
    ];

    private $buffer;

    public function getProxy() {
        if (empty($this->buffer))
            $this->buffer = self::PROXIES;
        $key = array_rand($this->buffer);
        $proxy = self::PROXIES[$key];
        unset($this->buffer[$key]);

        return $proxy;
    }
}

$randomiser = new RandomProxies;

foreach(range(1,4) as $n) {
    echo $randomiser->getProxy(), "\n";
}

示例输出:

foo.example.com
baz.example.com
bar.example.com
foo.example.com

答案 3 :(得分:0)

这似乎是generator的一个很好的应用程序。这需要一个代理地址数组,并以随机顺序遍历该数组,每次重新启动该循环时都会对其进行改组。

function get_proxy($proxies) {
    $i = 0;
    $len = count($proxies);
    while (true) {
        if ($i == 0) shuffle($proxies);
        yield $proxies[$i];
        $i = ($i + 1) % $len;
    }
}

要使用此功能,您需要执行以下操作:

$proxies = array('10.0.0.4', '192.168.0.1', '10.1.0.1');
$i = 0;
foreach (get_proxy($proxies) as $proxy) {
    echo "$proxy\n";
    $i++;
    // stop otherwise infinite loop
    if ($i == 9) break;
}

请注意,由于生成器中有一个无限循环,因此外部foreach循环也将是无限的,因此需要一种中断方法(在这种情况下,我使用了一个简单的计数器)。 / p>

上述代码的示例输出:

10.1.0.1
10.0.0.4
192.168.0.1
192.168.0.1
10.1.0.1
10.0.0.4
10.1.0.1
192.168.0.1
10.0.0.4

Demo on 3v4l.org

如果生成器不适合您的代码结构,则可以使用带有静态变量的函数在每次调用时返回一个新的代理:

$proxies = array('10.0.0.4', '192.168.0.1', '10.1.0.1');

function get_proxy($proxies) {
    static $i = 0, $keys;
    if (!isset($keys)) $keys = array_keys($proxies);
    if ($i == 0) shuffle($keys);
    $proxy = $proxies[$keys[$i]];
    $i = ($i + 1) % count($keys);
    return $proxy;
}

for ($i= 0; $i < 9; $i++) {
    echo get_proxy($proxies) . "\n";
}

此代码的示例输出:

10.1.0.1
10.0.0.4
192.168.0.1
192.168.0.1
10.1.0.1
10.0.0.4
10.0.0.4
192.168.0.1
10.1.0.1

Demo on 3v4l.org