2016-11-15 5 views
0

Ich versuche, durch multidimensionale Array zu gehen, habe ich eine Reihe von Schlüsseln, die ich in der multidimensionalen Array finden möchten, und nachdem ich es gefunden habe, seinen Wert zu diesem Schlüssel . Zum Beispiel habe ich einen Schlüssel Keyword und ich habe ein Arrayrekursiv durchlaufen multidimensionalen Array mit unterschiedlichen Ebenen der Tiefe

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 
      ) 
     ) 
    ) 
) 

Nun, ich versuchte es rekursiv zu tun, foreach($array as $key => $value) wenn $ value ein Array ist, dann muß ich in einer anderen Ebene gehen. Ich habe es geschafft, die Werte den Schlüsseln zuzuweisen, die ich wollte, aber statt 12 Stück habe ich 100 Stück bekommen.

Array von cloumn Namen

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

Arbeits Funktion für CSV-Format

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

Basierend auf meinem Verständnis einen Schlüsselnamen „Keyword“ gegeben, Sie wollen durch den mehrdimensionales Array gehen und die Schlüsselnamen finden "Keyword" und diesen Wert erhalten? –

+0

Ja, im Grunde habe ich ein Array von Spaltennamen, und ich möchte o gehen durch Bericht, der als Array gespeichert ist und Werte, die zu den Spaltennamen gehört. – rtom

+0

Können Sie uns auch die Anordnung der Spaltennamen geben? –

Antwort

1

ich Ihre Arrays neu erstellt, wenn mein Verständnis richtig ist, Sie wollen die Werte durch die gegebene rekursiv erhalten Array $ bing und die angegebenen Werte erhalten. Prüfen Sie dies:

$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>'; 

ich meine Antwort aktualisiert, so dass Sie sogar noch mehr Ebenen hinzufügen, es wird rekursiv die spezifischen Werte von Array von Spaltennamen angegeben finden. Versuchen Sie RecursiveArrayIterator erkunden

+0

Nun, diese verschachtelten foreach-Schleifen waren etwas, das ich nicht machen wollte, es sieht nicht gut aus, und das Hauptproblem ist, wenn ich eine weitere Ebene verschachtelter Arrays hinzufüge, wird es nicht funktionieren. Ich weiß nicht, ob ich es zu kompliziert mache, aber ich möchte, dass es für beliebig viele verschachtelte Arrays funktioniert. – rtom

+0

Nun, wenn Sie eine weitere Ebene für verschachtelte Array hinzufügen, gibt es keine andere Möglichkeit, als Ihre Überprüfung auf Ihre multidimensionalen Array anzupassen. Oder möchten Sie eine Funktion erstellen, mit der die Ebene des mehrdimensionalen Arrays validiert und überprüft wird und der Wert anhand der angegebenen Spaltennamen abgerufen wird? –

+0

Ich weiß nicht, ob ich den richtigen Ansatz habe. Ich musste ein objektorientiertes App-Design erstellen, das Anzeigenberichte in verschiedenen Formaten (csv, xml, json) lädt, Spalten extrahiert, die ich möchte, und sie in db speichern. Nach einer Weile habe ich das aufgegeben und jetzt möchte ich es nur zum Spaß implementieren. Aber das Problem ist, ich weiß nicht, wie die Berichte aussehen, außer der CSV. Also, wenn ich dies umsetze, weiß ich nicht, was die Formatierung der Dateien sein wird und so will ich, dass es in jedem Fall funktioniert. – rtom

0

Hier können Sie mit einer generischen Funktion gehen zu tun dem gleichen

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

Es tut etwas, aber wenn ich zu dem Punkt komme, dass $ key => $ value, dann muss ich durch mein Bing-Array gehen, das in OP ist, und überprüfen, ob irgendein $ Schlüssel zu einem Item passt 'von' bing' Array. Wenn ja, dann $ arr [$ key] [] = $ value – rtom

Verwandte Themen