2013-12-15 4 views
0

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

Array 
(
[Sid] => 23888555 
[pages] => Array 
    (
     [0] => Array 
      (
       [id] => 13111071 
       [name] => Page 1 
       [slots] => Array 
        (
         [0] => Array 
          (
           [SlotId] => 6 
           [info] => Array 
            (
             [id] => 5247 
             [color] => red 
            ) 

          ) 

         [1] => Array 
          (
           [SlotId] => 4 
           [info] => Array 
            (
             [id] => 5267 
             [color] => blue 
            ) 

          ) 

         [2] => Array 
          (
           [SlotId] => 7 
           [info] => Array 
            (
             [id] => 5267 
             [color] => green 
            ) 

          )      

        ) 

      ) 

     [1] => Array 
      (
       [id] => 13111072 
       [name] => Page 2 
       [slots] => Array 
        (
         [0] => Array 
          (
           [SlotId] => 6 
           [info] => Array 
            (
             [id] => 5247 
             [color] => red 
            ) 

          ) 

         [1] => Array 
          (
           [SlotId] => 4 
           [info] => Array 
            (
             [id] => 5267 
             [color] => blue 
            ) 

          ) 
        ) 

      ) 

    ) 

) 

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

Exemple:

[pages][0][slots][0][info][id] 
[pages][0][slots][1][info][id] 
[pages][0][slots][3][info][id] 

Для страницы 1, я хочу сравнить эти 3 идентификаторов между ними и подсчетом вхождений.

[pages][1][slots][0][info][id] 
[pages][1][slots][1][info][id] 

Для страницы 2, я хочу сравнить эти 2 идентификатора между ними и подсчитать случаи.

Выход я хочу выглядеть следующим образом:

page 1 -> 1x5247 
     -> 2x5267 

page 2 -> 1x5247 
     -> 1x5267 

EDIT:

Я попытался с помощью

foreach ($data['pages'] as $item) { 
    foreach ($item['slots'] as $slotnumber => $value) { 
     print_r(array_count_values($item['slots'][$slotnumber]['info'])); 
    } 
} 

который возвращает мне это:

Array ([5247] => 1 [red] => 1) 
Array ([5267] => 1 [blue] => 1) 
Array ([5267] => 1 [green] => 1) 

Так я думаю я могу быть в состоянии e это, но я не знаю, как это сделать.

+0

Вы пробовали что-нибудь? – goat

+0

Я попытался использовать array_count_values, то есть значения, которые я хочу сравнить, являются динамическими. Также, имея в виду первое значение, которое я получаю, а затем сравниваю его с остальными, проблема в том, что для каждой страницы она должна быть разной. – Reknawn

+0

Вам понадобится использовать множество петель foreach. –

ответ

0

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

<?php 


$data = Array("Sid" => "23888555", "pages" => Array("0" => Array("id" => "13111071", "name" => "Page 1", "slots" => Array("0" => Array("SlotId" => "6", "info" => Array("id" => "5247", "color" => "red")), "1" => Array("SlotId" => "4", "info" => Array("id" => "5267", "color" => "blue")), "2" => Array("SlotId" => "7","info" => Array("id" => "5267", "color" => "green")))), 

     "1" => Array 
     (
      "id" => "13111072", 
      "name" => "Page 2", 
      "slots" => Array 
       (
        "0" => Array 
         (
          "SlotId" => "6", 
          "info" => Array 
           (
            "id" => "5247", 
            "color" => "red" 
           ) 

         ), 

        "1" => Array 
         (
          "SlotId" => "4", 
          "info" => Array 
           (
            "id" => "5267", 
            "color" => "blue" 
           ) 
         ) 
       ) 

     ) 

    ) 

); 
//End of array declaration 






//Now the really convoluted coding starts 


//Create a function 
function countstuff($yourarray){ 

    foreach($yourarray as $mainarraykey => $mainarray){ 
     if($mainarraykey == "pages"){ 
      foreach($mainarray as $pageskey => $pagesarray){ 

      //echo "Page \"$pageskey\"<br/>"; 

       foreach($pagesarray as $pagessubarraykey => $pagessubarray_array){ 
        if($pagessubarraykey == "slots"){ 

         foreach($pagessubarray_array as $slotskey => $slots){ 

          foreach($slots as $slotssubkey => $slotssub){ 
           if($slotssubkey == "info"){ 

            foreach($slotssub as $key => $value){ 
             if($key == "id"){ 
             //echo $value."<br/>"; 
             $pages[$pageskey][] = $value; 
             } 
            } 
           } 
          } 
         } 

        } 

       } 

     } 
     } 
    } 


    return $pages; 

} 




//Execute the countstuff() function 
$output = countstuff($data); 



function showresults($input){  
    foreach($input as $pagekey => $page){ 

     echo "Page $pagekey:<br/>";  

     $results = array_count_values($page); 

     foreach($results as $resultkey => $result){ 
      echo $result."x".$resultkey."<br/>"; 
     } 

    echo "<br/>"; 
    } 
} 


showresults($output); 

?> 
+0

Это работает очень хорошо! – Reknawn

0

Я попробовал кое-что, чтобы вы знали, что вы, ребята, думаете об этом.

Я получаю то каждый идентификатор ввести их в массив затем использовать array_count_values ​​

$array_ids = array(); 

foreach ($data['pages'] as $item) { 

    $numberOfElements = count($item['slots']); 
    $z= 0; 

    foreach ($item['slots'] as $slotnumber => $value) { 

     $array_ids[$z] = $item['slots'][$slotnumber]['info']['id']; 

     // search for occurrences when the array is full 
     if (count($array_ids) == $numberOfElements) { 

      var_dump(array_count_values($array_ids)); 

      // reset the array to 0 every time we loop through the whole infos 
      $array_ids = array(); 
     } 
     $z++; 
    } 
} 

Это похоже на работу для каждой страницы.

array (size=2) 
    5267 => int 2 
    5247 => int 1 

array (size=2) 
    5267 => int 1 
    5247 => int 1 
Смежные вопросы