PHP 3D массив подсчитывает уникальные значения - PullRequest
1 голос
/ 11 октября 2011

У меня есть 3D-массив. Мне нужно извлечь следующее:

  1. количество экземпляров уникальных предметов в массиве самого глубокого уровня
  2. количество совпадений определенных элементов в массиве самого глубокого уровня

Массив выглядит так:

$arr = (
       [0] => array([0] => array([flag][token][value])
                    [1] => array([flag][token][value])
                    )
       )

Я попытался перебрать массив, используя цикл для и оператор if , например:

$new_arr1 = ""; // $new_arr1 = array(); //same thing, the later code doesn't work

for ($i=0; $i<count($arr);$i++)
{
    for ($j=0; $j<count($arr[$i]); $j++)
        {

          $value= $arr[$i][$j][value];

          if ($arr[$i][$j][flag] == "noun")
             array_push($new_arr1, $value)

          elseif ($arr[$i][$j][flag] == "verb")
             array_push($new_arr2, $value)
        }
}

сделал то же самое с оператором switch , не смог заставить его работать. Выполняя этот вид кондиционирования, я надеялся получить все значения из самого глубокого массива уровней, которые соответствуют определенным критериям, в один массив, а затем выполнить * array_count_values ​​* для них. Это дало бы мне следующее:

для flag == "существительное", значение value элемента, хранящегося в $ new_arr1, и для flag == "verb", значение значение элемент хранится в $ new_arr2:

$new_arr1 = (
           [dog] => 7
           [cat] => 2
           [horse] => 4
          );

$new_arr2 = (
           [chase] => 2
           [eat] => 5
           [pwn] => 3
          );

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

Кроме того, мне нужно выполнить подсчет совпадений этих значений, что-то вроде этого:

подсчитывает количество раз, когда какой-либо токен с определенным флагом появляется до или после другого токена с определенным флагом:

псевдокод:

$count=0;
if ( (($arr[$i][$j][flag] == "noun") && ($arr[$i][$j][value] == "dog")) &&
     (($arr[$i][$j+/-1][flag] == "verb") && ($arr[$i][$j+/-1][value] == "chase"))
   )
$count++;

$counter = array($count = array($arr[$i][$j][value]), $arr[$i][$j+/-1][value])

, что в основном даст следующее:

counter:
array(
      "7" => ([0] => "dog", [1] => "chase")
      "4" => ([0] => "cat", [1] => "eat")
     )

где «7» и «4» - это имена ассоциативного массива, а «собака» и «погоня» - это значения, хранящиеся в другом массиве.

     )

1 Ответ

2 голосов
/ 11 октября 2011

Я не уверен, что буду следовать вашему вопросу на 100%, но что-то вроде этого может сработать:

$verb_array = array();
$noun_array = array();
foreach($arr as $index => $data){
    if($data['flag'] == 'noun'){
        if(isset($noun_array[$data['value']])){
            $noun_array[$data['value']]++;
        }
        else{
            $noun_array[$data['value']] = 0;
        }
    }
    else if($data['flag'] == 'verb'){
        if(isset($noun_array[$data['value']])){
            $verb_array[$data['value']]++;
        }
        else{
            $verb_array[$data['value']] = 0;
        }            
    }
}

Затем, чтобы получить количество вхождений:

$noun_count = count($noun_array);
$verb_count = count($verb_array);

И если вам нужен счетчик определенного элемента, он будет существовать внутри массива.

...