我的代码有问题。我想要做的是在调用数组时删除数组中的一项,这意味着我希望每个输出都不同。我想使用它来旋转代理,并且阵列中有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循环不适合此操作?预先感谢。
答案 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
如果生成器不适合您的代码结构,则可以使用带有静态变量的函数在每次调用时返回一个新的代理:
$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