我如何设置这个大双重foreach吧?

时间:2016-01-20 11:39:27

标签: php arrays foreach

我在另一个foreach中有一个foreach。这个foreach的原因是我希望得到一个包含IP的多个数组,以及来自IP的所有日期......这有点复杂......我需要格式化的日期:

Y-m-d,H:m:s

这很有效,但我的多变量的结束输出并不像我预期的那样。

类似于foreach的第一部分的输出是这样的:

    Array
    (
        [0] => Array
            (
            )

        [1] => Array
            (
                [ip] => 72.xx.xx.xx
                [all_dates] => Array
                    (
                        [0] => 12/Oct/2015:00:30:15
                        [1] => 12/Oct/2015:00:30:24
                        [2] => 12/Oct/2015:00:30:49
                        [3] => 12/Oct/2015:00:30:57
                        [4] => 12/Oct/2015:00:30:57

[2] => Array
        (
            [ip] => 85.xx.xxx.xx
            [all_dates] => Array
                (
                    [0] => 12/Oct/2015:00:32:19
                    [1] => 12/Oct/2015:00:32:33
                    [2] => 12/Oct/2015:00:32:33
                    [3] => 12/Oct/2015:00:34:30
                    [4] => 12/Oct/2015:00:38:59
                    [5] => 12/Oct/2015:00:39:20
                )

        )

首先..我不知道为什么[0] =>数组为空或更好为什么[1] =>数组不在[0]处

第二件事是我需要所有日期格式化。我在第二个foreach循环中做到了这一点,但在此之后,多个没有得到正确的输出。那么它还没有真正的产出......

这是我的代码(更新):

            $diff_ips = array_unique($ip_array);
    $ip_with_date = [];
    foreach ($diff_ips as $ip) {
        $get_dates = shell_exec("grep $ip $path" . $inputs['domain'] . ".log | awk '{print $4}'");
        $new_date = str_replace('[', '', $get_dates);
        $array_date = explode("\n", $new_date);
        array_pop($array_date);
        foreach ($array_date as &$dates) {
            $dates[11] = ' ';
            $dates = date('Y-m-d, H:m:s', strtotime(str_replace('/', '-',   $dates)));
        }
    }
    $ip_with_date[] = [
        'ip' => $ip,
        'all_dates' => $array_date
    ];

    echo "<pre>";
    print_r($ip_with_date);
    echo "<pre>";

更新代码后的当前输出:

Array
(
    [0] => Array
        (
            [ip] => 66.xx.xxx.xx
            [all_dates] => Array
                (
                    [0] => 2015-10-12, 01:10:36
                    [1] => 2015-10-12, 01:10:46
                    [2] => 2015-10-12, 01:10:06
                )

        )

)

第一个foreach循环结束(结束=第二个循环开始的地方),给出你在上面看到的输出。

但是这个日期并没有很好地形成。这就是为什么我有第二个foreach循环。在

$dates[11] = ' ';

行,是因为后面的行有11.字符的问题。这就是为什么我把它设置为&#39;:&#39;到&#39; &#39;

在我定义$ formated_date变量时,日期看起来很完美。但当然它不会覆盖多个数组中的日期,这是我的问题。

我真的尽力而为,但还没有找到解决方案。最后的输出应如下所示:

 Array
    (
        [0] => Array
            (
                [ip] => 72.xx.xx.xx
                [all_dates] => Array
                    (
                        [0] => 2015-10-12 00:30:15
                        [1] => 2015-10-12 00:30:20
                        ...

[1] => Array
        (
            [ip] => 85.xx.xxx.xx
            [all_dates] => Array
                (
                    [0] => 2015-10-12 00:30:40
                    [1] => 2015-10-12 00:31:05
                    ...
                )
        )

正如我所说,它有点复杂。

解决。
工作代码:

$diff_ips = array_unique($ip_array);
        $ip_with_date = [];
        foreach ($diff_ips as $ip) {
            $get_dates = shell_exec("grep $ip $path" . $inputs['domain'] . ".log | awk '{print $4}'");
            $new_date = str_replace('[', '', $get_dates);
            $array_date = explode("\n", $new_date);
            array_pop($array_date);
            foreach ($array_date as &$dates) {
                $dates[11] = ' ';
                $dates = date('Y-m-d H:m:s', strtotime(str_replace('/', '-',   $dates)));

            }
            $ip_with_date[] = [
                'ip' => $ip,
                'all_dates' => $array_date
            ];
        }

2 个答案:

答案 0 :(得分:1)

第一个问题:

定义

<input type="text" id="txt1">

表示 - 将$ip_with_date[] = []; 视为数组并向其添加空数组。这是您在密钥$ip_with_date

处的空数组

将其替换为:

0

第二个问题:

所以你有$ip_with_date = []; // no [] here 。你期待什么?它只是一个变量,你什么都不做。以某种方式分配或做某事。但我建议你这样做:

$format_date

答案 1 :(得分:-1)

请尝试以下代码

{{1}}