2016-11-15 2 views
0

Я пытаюсь пройти через многомерный массив, у меня есть массив ключей, который я хочу найти в многомерном массиве, и после того, как я его нашел, объявите его значение указанному ключу , Например, у меня есть ключ Keyword и у меня есть массивРекурсивно пройти через многомерный массив с различными уровнями глубины

Array (
    [root] => Array ( 
     [row] => Array ( 
      [0] => Array ( 
       [Status] => Enabled 
       [Keyword] => Toaletna voda 
       [Campaign] => Lešenari 
       [Adgroup] => Lešenaris 
       [BidStrategyType] => InheritFromParent 
       [Bid] => 0.05 
       [Matchtype] => Broad 
       [Clicks] => 0 
       [Impr.] => 0 
       [Conv.] => 0 
      ) 
     ) 
    ) 
) 

Ну, я пытался сделать это рекурсивно, foreach($array as $key => $value) если $ значение является массивом, то я должен идти другой уровень внутри. Мне удалось получить значения, назначенные клавишам, которые мне нужны, но вместо 12 элементов я получил 100 из них.

Массив имен cloumn

$bing = array(
"Adgroup", 
"Campaign", 
"Keyword", 
"Clicks", 
"Impr.", 
"Conv.", 
"Bid", 
"Adgroup" 
); 

функции Работа для формата CSV

public function LoadCsvReport($adSystemColumnsColumns = array()) 
{ 
    require "config.php"; 
    $key = array(); 
    $flag = false; 


    $csvfile = fopen(dirname(__FILE__) . "/result.csv", "r"); 

    while ($file = fgetcsv($csvfile)) { 
     if (!$flag) { 
      /*Loop through config array which contains names of columns of our interest 
       If row from file contains name from config, then that name will have assigned 
       index of that column 
      */ 
      foreach ($bing as $name) 
       if ($value = array_search($name, $file)) { 
        $key[$name] = $value; 
        $flag = true; 
       } 
      //After column indexes are assigned to names skip current row 
      if ($flag) 
       continue; 
     } 
     if ($flag) { 

      foreach ($key as $columnName => $index) { 
       /*Get columnname and index, items from $file[$index] are assign to 
        corresponding array with columnName as index 
       */ 
       if ($file[$index] === "-") 
        break; 
       $this->report[$columnName][] = $file[$index]; 
       //$key[$index] = array($item => $file[$item]); 

      } 
     } 
    } 
    fclose($csvfile); 
    return $this->report; 
} 
+0

Основываясь на моем понимании, дали кодовое имя «Ключевое слово», Вы хотите, чтобы пройти через многомерный массив и найти имя ключа «Ключевое слово» и получить эту ценность? –

+0

Да, в основном у меня есть массив имен столбцов, и я хочу o просматривать отчет, который сохраняется как массив и получать значения, принадлежащие этим именам столбцов. – rtom

+0

Можете ли вы дать нам также массив имен столбцов? –

ответ

1

Я воссоздал свои массивы, если я понимаю правильно, вы хотите рекурсивно получить значения по данному array $ bing и получить назначенные значения. Проверьте это:

$bing = array(
"Adgroup", 
"Campaign", 
"Keyword", 
"Clicks", 
"Impr.", 
"Conv.", 
"Bid", 
"Adgroup" 
); 

$arr = array(
    "root" => array( 
       "row" => array( 
          array ( 
           "Status" => "Enabled" 
           ,"Keyword" => "Toaletna voda" 
           ,"Campaign" => "Lešenari" 
           ,"Adgroup" => "Lešenaris" 
           ,"BidStrategyType" => "InheritFromParent" 
           ,"Bid" => "0.05" 
           ,"Matchtype" => "Broad" 
           ,"Clicks" => "0" 
           ,"Impr." => "0" 
           ,"Conv." => "0") 
           ) 
          ) 
); 


echo '<pre>'; 
    print_r($arr); 
echo '</pre>'; 

EDIT

function GetValues($array, $newArr) { 
    $new_arr = array(); 
    $array_obj = new RecursiveIteratorIterator(new RecursiveArrayIterator($array)); 
    foreach($array_obj as $key => $value) { 
     foreach($newArr as $val) { 
      if($val == $key) { 
       $new_arr[$val] = $value; 
      } 

     } 
    } 
    return $new_arr; 
} 

$new_arr_ = GetValues($arr, $bing); 

echo '<pre>'; 
    print_r($new_arr_); 
echo '</pre>'; 

Я обновил свой ответ так, что даже добавить еще больше уровней будет рекурсивно найти конкретные значения, даваемые массиве имен столбцов. Попробуйте исследовать RecursiveArrayIterator

+0

Ну, эти вложенные петли foreach были чем-то, что я не хотел делать, это не выглядит хорошо, и основная проблема заключается в том, что если я добавлю еще один уровень вложенного массива, это не сработает. Я не знаю, насколько я его преувеличиваю, но я хочу, чтобы он работал для любого количества вложенных массивов. – rtom

+0

Ну, если вы добавите еще один уровень для вложенного массива, нет другого способа, кроме как настроить проверку на вашем многомерном массиве. Или вы хотите создать функцию, которая будет выполнять грязную работу по проверке и проверке уровня многомерного массива и получить значение на основе заданных имен столбцов? –

+0

Я не знаю, есть ли у меня правильный подход. Я должен был сделать и объектно ориентированный дизайн приложения, которое будет загружать рекламные отчеты в разных форматах (csv, xml, json), извлекать столбцы, которые я хочу, и сохранять их в db. Через некоторое время я как бы отказался от этого, и теперь я хочу реализовать его просто для удовольствия. Но проблема в том, что я не знаю, как выглядят отчеты, кроме csv. Поэтому, когда я реализую это, я не знаю, каким будет формирование файлов, и поэтому я хочу, чтобы он работал в каждом случае. – rtom

0

Здесь вы идете с общей функцией для выполнения той же

function assignVal ($arr){ 
     $finalArr = []; 
     foreach($arr as $key=>$value){ 
      if(is_array($value)){ 
       $return = assignVal($value); 
       $finalArr = array_merge($finalArr,$return); 
      }else{ 
       $finalArr[] = $value; 
      } 
     } 
     return $finalArr; 
    } 
    // sample array 
    $firstArr = ['w'=>['a','b','c'],'d','t']; 
    $finalArr = assignVal($firstArr); 
    print_r($finalArr); // output ['a','b','c','d','t'] 
+0

Это что-то делает, но когда я догадаюсь, что '$ key => $ value', тогда мне нужно пройти через массив' bing', который находится в OP, и проверить, соответствует ли какой-либо '$ key'' элементу 'из массива' bing'. Если да, то '$ arr [$ key] [] = $ value' – rtom

Смежные вопросы