неправильный счет в функции подсчета с php

1
$checkvpn = trim('sudo ifconfig | grep -i "inet addr:" | cut -d ":" -f2 | awk '{print $1}'');
$checkvpnstring = (string)$checkvpn;
$checkvpncount = count("\n",$checkvpnstring);
$checkvpncount++;
$checkvpnexplode = explode("\n", $checkvpnstring);

for($i=0;$i<=$checkvpncount;$i++){
    $ip = $checkvpnexplode[$i];
    if($ip == $externalip){
        $vpnconfigured = "yes";
        break;
    }
}

У меня есть код выше, в котором я получаю все ip, доступные на моей Linux-машине. Но проблема возникла, когда у меня есть 13 ip и счет только 3, и если я эхо $checkvpnexplode[12] тогда он печатает 13-й IP-адрес.

Мой вопрос в том, почему функция count только считает 3, а функция explode дает результат для всех.
Я использовал ту же функцию для взрыва и подсчета.

значение $ checkvpn = 10.10.1.1 10.10.2.1 103.29.235.45 127.0.0.1

значение $ checkvpnstring = 10.10.1.1 10.10.0.1 10.10.8.1 103.29.235.15 10.10.10.1 127.0.0.1 10.10.12.1 10.10.9.1 10.10.11.1 10.10.7.1 10.10.5.1 10.10.2.1 10.10.6.1 10.10.3.1 10.10.4.1

значение $ checkvpnstring = 10.10.1.1 10.10.0.1 10.10.8.1 103.29.235.15 10.10.10.1 127.0.0.1 10.10.12.1 10.10.9.1 10.10.11.1 10.10.7.1 10.10.5.1 10.10.2.1 10.10.6.1 10.10.3.1 10.10.4.1

  • 0
    Можете ли вы показать значение $checkvpn или $checkvpnstring ?
  • 1
    разве не стоит count после explode ? почему вы count с параметрами ?, напр. count("\n",$checkvpnstrin); ?
Показать ещё 3 комментария
Теги:
count
explode

3 ответа

0

Функция count в PHP используется для подсчета количества элементов в массиве, тогда как вы применяете функцию count в строке

Дополнительную информацию о count() можно найти здесь: http://php.net/manual/en/function.count.php

Теперь, чтобы достичь того, чего вы хотите, сначала нужно применить explode к $checkvpnstring и преобразовать его в массив, а затем применить функцию count.

Подробнее об explode(): http://php.net/manual/en/function.explode.php

Как это:

$checkvpn = trim('sudo ifconfig | grep -i "inet addr:" | cut -d ":" -f2 | awk '{print $1}'');
$checkvpnstring = (string)$checkvpn;
$checkvpnexplode = explode(" ", $checkvpnstring);
$checkvpncount = count($checkvpnexplode);

// Now, back to that loop
for($i=0;$i<=$checkvpncount;$i++){
    // Your rest of the logic
}
0

$checkvpncount = count("\n",$checkvpnstring); неправильно; должен быть $checkvpncount = count($checkvpnstring); это похоже на ошибку с копированием в вашем выражении explode

Я проверил ваш код и внес небольшие изменения:

<?
$vpnconfigured = "no";
$externalip = "1.2.3.4";
$checkvpn = trim('sudo ifconfig | grep -i "inet addr:" | cut -d ":" -f2 | awk '{print $1}'');
$checkvpnstring = (string)$checkvpn;
$checkvpncount = count($checkvpnstring);
$checkvpncount++;
$checkvpnexplode = explode("\n", $checkvpnstring);

for($i=0;$i<=$checkvpncount;$i++){
    $ip = $checkvpnexplode[$i];
    if($ip == $externalip){
        $vpnconfigured = "yes";
        break;
    }
}
var_dump($checkvpncount);
var_dump($checkvpnexplode);
var_dump($checkvpn);
echo $vpnconfigured;
?>

Похоже, что ваш счет смущался дополнительным параметром;

выход:

int(2)
array(2) {
  [0]=>
  string(13) "192.168.1.240"
  [1]=>
  string(9) "127.0.0.1"
}
string(23) "192.168.1.240
127.0.0.1"

и мой соответствующий вывод ifconfig:

eth0      Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
          inet addr:192.168.1.240  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: xxxx::xxxx:xxxx:xxxx:xxxx/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6501443 errors:0 dropped:7 overruns:0 frame:21
          TX packets:7860026 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2026553110 (1.8 GiB)  TX bytes:5197150028 (4.8 GiB)
          Interrupt:18

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:146814 errors:0 dropped:0 overruns:0 frame:0
          TX packets:146814 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:25834701 (24.6 MiB)  TX bytes:25834701 (24.6 MiB)
0

Используйте нижеследующее, нет необходимости бросать в виде строки или подсчитывать, как вы это делаете:

$ips = trim('ifconfig | grep -i "inet addr:" | cut -d ":" -f2 | awk '{print $1}'');

$a = explode(PHP_EOL,$ips);

$trimmedArray = array_map('trim', $a); // trim again to remove internal new lines

print "we have " . count($trimmedArray) . " ips in total" . PHP_EOL;

foreach($trimmedArray as $ip){
    print $ip . PHP_EOL;
    // you can process each IP further here
}

print_r($trimmedArray);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню