PHP итерировать многомерный массив - PullRequest
3 голосов
/ 30 декабря 2011

Как я могу перебрать этот многомерный массив и вернуть количество положительных чисел и число отрицательных чисел. Ответ должен быть 1 положительным и 5 отрицательным. Спасибо.

Array
(
[Nov 18, 2011] => Array
    (
        [C] => Array
            (
                [C] => Array
                    (
                        [T] => -1324.388328
                    )
                [S] => Array
                    (
                        [T] => -249.976472
                    )
            )
    )
[Dec 24, 2011] => Array
    (
        [C] => Array
            (
                [C] => Array
                    (
                        [T] => -2523.107928
                    )
                [S] => Array
                    (
                        [T] => 103.533528
                    )
            )
    )
[Dec 27, 2011] => Array
    (
        [C] => Array
            (
                [C] => Array
                    (
                        [T] => -4558.837928
                    )
                [S] => Array
                    (
                        [T] => -1639.376472
                    )
            )
    )
)

Ответы [ 3 ]

2 голосов
/ 30 декабря 2011

Вы также можете использовать SPL RecursiveIteratorIterator в сочетании с RecursiveArrayIterator, например:

$pos = $neg = 0;
foreach( new RecursiveIteratorIterator( new RecursiveArrayIterator( $data ) ) as $item )
{
    if( !is_numeric( $item ) ) continue;

    $item < 0 ? $neg++ : $pos++;
}
var_dump( $pos, $neg );

Где $data представляет ваш многомерный массив.RecursiveIteratorIterator по умолчанию используется только итерация, как это называется, листьев (элементов, которые не имеют дочерних элементов).В качестве меры безопасности я все еще включил тест, чтобы проверить, действительно ли элемент является числовым значением.

1 голос
/ 30 декабря 2011

Если целью является подсчет положительных и отрицательных чисел многомерного массива неизвестной глубины, создайте рекурсивную функцию. Если это не так, рекурсивная функция также выполнит работу.

function countFromMultidimentionalArray($array)
{
    $positiveCount = 0;

    foreach($array as $value)
    {
        if(is_array($value))
        {
            $positiveCount += countFromMultidimentionalArray($value);
        }
        else
        {
            if($value >= 0)
            {
                $positiveCount++;
            }
        }
    }

    return $positiveCount;
}

Я не проверял это, и он считал только положительные числа. Вы можете создать аналогичную функцию, которая считает только отрицательные значения или , что более интересно, найти способ выполнения обоих в одной и той же функции (возможно, с использованием объекта?). Это просто для того, чтобы дать вам идею, так как это похоже на домашнюю работу, и я не хочу портить все удовольствие :))

РЕДАКТИРОВАТЬ: Учитывая тот факт, что это не домашняя работа, вот более сложное решение, используя массив для хранения обоих значений.

function countFromMultidimentionalArray($array)
{
    $values = array();
    $values["positive"] = 0;
    $values["negative"] = 0;

    foreach($array as $value)
    {
        if(is_array($value))
        {
            $result += countFromMultidimentionalArray($value);
            $values["positive"] += $result["positive"];
            $values["negative"] += $result["negative"];
        }
        else
        {
            if($value >= 0)
            {
                $values["positive"]++;
            }
            else
            {
                $values["negative"]++;
            }
        }
    }

    return $values;
}

Тоже не проверял. Надеюсь, это поможет!

0 голосов
/ 31 декабря 2011

У меня были некоторые проблемы с рекурсивным решением этой проблемы, так как я также учусь [установка нуля на счетчик, как показано выше, сотрет текущий счетчик при каждом рекурсивном вызове, и я не решил ошибки ссылки / области при передаче счетчиковв качестве аргументов функции].

Кроме того, мне пришлось изменить обозначение вашего исходного определения массива, чтобы мой тест работал.
A) Я предположил, что ваши ключи должны быть строковыми литералами, а не переменными или константами,Поэтому я добавил обертки.Если они должны были быть переменными, определенными в другом месте, добавьте ваш '$' ..
B) Вам нужно разделить запятую вашего списка элементов в одном массиве, который я добавил
C) Не технически необходимо, ноЯ не использую скобочные обозначения при определении, только при доступе по ключу после создания.Выбор разработчика, но он помогает мне определить, являюсь ли я (создаю или использую существующие) элементы массива, когда вернусь к коду позже.
D) Не забудьте включить ваш ';'после определения массива данных определения массива не являются самозакрывающимися, как у функции или условного кода {} структура

Следует признать, что это несколько менее надежное решение, чем рекурсия, но оно дает вам полный доступ к каждому элементу по ключуи по значению, в этот момент вы можете сообщать или манипулировать значениями по мере необходимости.Ограничение в этом методе заключается в том, что вам нужно знать, сколько уровней вложенности (и, следовательно, сколько циклов foreach).В результате добавление элементов к существующим уровням массива не повлияет на логику цикла.

<?php

  function html_pp ( $text ) // no return
  {
    // echo paragraph to browser
    echo PHP_EOL . '<p>' . Sprintf ( $text ) . '</p>' . PHP_EOL;
  }

  // Data array
  $data = Array
  (
    'Nov 18, 2011' => Array
    (
      'C' => Array
      (
        'C' => Array ( 'T' => -1324.388328 ), // comma
        'S' => Array ( 'T' => -249.976472  )
      )
    ), // comma
    'Dec 24, 2011' => Array
    (
      'C' => Array
      (
        'C' => Array ( 'T' => -2523.107928 ), // comma
        'S' => Array ( 'T' => 103.533528   )
      )
    ), // comma
    'Dec 27, 2011' => Array
    (
      'C' => Array
      (
        'C' => Array ( 'T' => -4558.837928 ), // comma
        'S' => Array ( 'T' => -1639.376472 )
      )  
    )
  ); // end array def

  // Count variables
  $positive = 0;
  $negative = 0;

  html_pp ( 'Data Array :' );

  // Loop using key => value pairs
  foreach ( $data as $i => $date ) // Iterate through date elements
  {
    foreach ( $date as $j => $c ) // Iterate through C elements
    {
      foreach ( $c as $k => $cs ) // Iterate through C/S elements
      {
        foreach ( $cs as $n => $t ) // Iterate though T elements
        {
          // echo current element nesting path and value
          html_pp ( $i . '>' . $j . '>' . $k . '>' . $n . ' = ' . $t );
          // update +- counts
          if ( $t < 0 ) { $negative += 1; }
          else          { $positive += 1; }
        }
      }
    }
  }

  html_pp ( 'Positive : ' . $positive );
  html_pp ( 'Negative : ' . $negative );

?>

Вывод браузера:

Массив данных:

18 ноября 2011 г.> C>C> T = -1324.388328

18 ноября 2011 г.> C> S> T = -249,976472

24 декабря 2011 г.> C> C> T = -2523.107928

24 декабря 2011 г.> C> S> T = 103,533528

27 декабря 2011 г.> C> C> T = -4558,837928

27 декабря 2011 г.> C> S> T = -1639,376472

Положительный: 1

Отрицательный: 5

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...