rtom rtom - 1 year ago 105
PHP Question

Recursively go through multidimensional array with varying levels of depth

I am trying to go through multidimensional array, I have an array of keys that I want to find in the multidimensional array, and after i found it, assaign its value to said key. For example I have an key

Keyword
and I have an array

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


Well I tried to do it recursively,
foreach($array as $key => $value)
if $value is an array, then i need to go another level inside. I managed to get the values assigned to keys that i wanted, but instead of 12 items I got 100 of them.

Array of cloumn names

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


Working function for 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;
}

Answer Source

I re-created your arrays, if my understanding is right, you want to recursively get the values by the given array $bing and get the designated values. Check this:

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

I updated my answer so that even you add even more levels it will recursively find the specific values given by your array of column names. Try exploring RecursiveArrayIterator

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download