Jump to content

PHP Filter multidimensional-array key with another array


Tony_146

Recommended Posts

What I'm trying to do is read in a worksheet from an excel file and only keep certain columns based on a list in another array. I able to read in the excel sheet using PHPExcel, but haven't been successfully filtering out the unwanted column keys. I have been searching the web and been trying to apply the following: array_intersect_key, functions, array_filter and no success.

      <?php

    /** Include path **/
    set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/');

    /** PHPExcel_IOFactory */
    include 'PHPExcel/IOFactory.php';


    //$inputFileType = 'Excel5';
    //  $inputFileType = 'Excel2007';
    //  $inputFileType = 'Excel2003XML';
    //  $inputFileType = 'OOCalc';
    //  $inputFileType = 'Gnumeric';
    $inputFileName = './sampleData/example1.xls';
    $sheetname = 'Visual';

    $inputFileType = PHPExcel_IOFactory::identify($inputFileName);
    echo 'Loading file ',pathinfo($inputFileName,PATHINFO_BASENAME),' using IOFactory with a defined reader type of ',$inputFileType,'<br />';
    $objReader = PHPExcel_IOFactory::createReader($inputFileType);
    echo 'Loading Sheet "',$sheetname,'" only<br />';
    $objReader->setLoadSheetsOnly($sheetname);
    $objPHPExcel = $objReader->load($inputFileName);


    echo '<hr />';

    echo $objPHPExcel->getSheetCount(),' worksheet',(($objPHPExcel->getSheetCount() == 1) ? '' : 's'),' loaded<br /><br />';
    $loadedSheetNames = $objPHPExcel->getSheetNames();
    foreach($loadedSheetNames as $sheetIndex => $loadedSheetName) {
        echo $sheetIndex,' -> ',$loadedSheetName,'<br />';
    }

    $sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true);

    // Removes NULL values
    foreach($sheetData as $key => &$row) {
        $row = array_filter($row,function($cell){return !is_null($cell);});
        if (count($row) == 0) {
            unset($sheetData[$key]);
        }
    }
    unset ($row);

    unset ($sheetData[1]); // Remove row 1 of spreadsheet 
    unset ($sheetData[2]); // Remove row 2 of spreadsheet

    // columns what to keep, this is just example
    $col_keep = array('A', 'B', 'D', 'K');

    foreach($sheetData as $k=>$v) {
      foreach($v as $c=>$vb){
      echo "$c<br>"; // this display the columns keys e.g A,B,C,etc... 
      // How to filter here with array $col_keep?        
      }
    }

     ?>

Here are the results:

Array ( [1] => Array ( [A] => DATE 5/13/13 [B] => [C] => [D] => [E] => [F] => [G] => [H] => [I] => [J] => [K] => [L] => [M] => [N] => [O] => ) [2] => Array ( [A] => Bunch of numbers [B] => [C] => [D] => [E] => [F] => [G] => [H] => [I] => [J] => [K] => [L] => [M] => [N] => [O] => ) [3] => Array ( [A] => cat [B] => dog [C] => snake [D] => rat [E] => pig [F] => cow [G] => sheep [H] => horse [I] => fish [J] => hamster [K] => bird [L] => goat [M] => chicken [N] => parrot [O] => shark ) [4] => Array ( [A] => 1 [B] => [C] => [D] => [E] => [F] => [G] => [H] => [I] => [J] => [K] => [L] => [M] => [N] => [O] => ) [5] => Array ( [A] => [B] => 1 [C] => 2 [D] => [E] => [F] => [G] => [H] => [I] => [J] => [K] => [L] => [M] => [N] => [O] => ) [6] => Array ( [A] => [B] => 3 [C] => 4 [D] => [E] => [F] => [G] => [H] => [I] => [J] => [K] => [L] => [M] => [N] => [O] => ) [7] => Array ( [A] => [B] => [C] => [D] => 1 [E] => 2 [F] => 3 [G] => [H] => [I] => [J] => [K] => [L] => [M] => [N] => [O] => ) [8] => Array ( [A] => [B] => [C] => [D] => 4 [E] => 5 [F] => 6 [G] => [H] => [I] => [J] => [K] => [L] => [M] => [N] => [O] => ) [9] => Array ( [A] => [B] => [C] => [D] => 7 [E] => 8 [F] => 9 [G] => [H] => [I] => [J] => [K] => [L] => [M] => [N] => [O] => ) [10] => Array ( [A] => [B] => [C] => [D] => [E] => [F] => [G] => 1 [H] => 2 [I] => 3 [J] => 4 [K] => [L] => [M] => [N] => [O] => ) [11] => Array ( [A] => [B] => [C] => [D] => [E] => [F] => [G] => 5 [H] => 6 [I] => 7 [J] => 8 [K] => [L] => [M] => [N] => [O] => ) [12] => Array ( [A] => [B] => [C] => [D] => [E] => [F] => [G] => 9 [H] => 10 [I] => 11 [J] => 12 [K] => [L] => [M] => [N] => [O] => ) [13] => Array ( [A] => [B] => [C] => [D] => [E] => [F] => [G] => 13 [H] => 14 [I] => 15 [J] => 16 [K] => [L] => [M] => [N] => [O] => ) [14] => Array ( [A] => [B] => [C] => [D] => [E] => [F] => [G] => [H] => [I] => [J] => [K] => 1 [L] => 2 [M] => 3 [N] => 4 [O] => 5 ) [15] => Array ( [A] => [B] => [C] => [D] => [E] => [F] => [G] => [H] => [I] => [J] => [K] => 6 [L] => 7 [M] => 8 [N] => 9 [O] => 10 ) [16] => Array ( [A] => [B] => [C] => [D] => [E] => [F] => [G] => [H] => [I] => [J] => [K] => 11 [L] => 12 [M] => 13 [N] => 14 [O] => 15 ) [17] => Array ( [A] => [B] => [C] => [D] => [E] => [F] => [G] => [H] => [I] => [J] => [K] => 16 [L] => 17 [M] => 18 [N] => 19 [O] => 20 ) [18] => Array ( [A] => [B] => [C] => [D] => [E] => [F] => [G] => [H] => [I] => [J] => [K] => 21 [L] => 22 [M] => 23 [N] => 24 [O] => 25 ) ) 

i'm not sure how you are going to use this data, but assuming an array that only has the $col_keep columns left in it will work, try this -

$col_keep = array_flip(array('A', 'B', 'D', 'K')); // make these values into the array keys

foreach($sheetData as $k=>$v) { // $v is the array you want to filter
    $keep = array_intersect_key($v,$col_keep); // intersect using the keys
    print_r($keep);
}

 

i'm not sure how you are going to use this data, but assuming an array that only has the $col_keep columns left in it will work, try this -

$col_keep = array_flip(array('A', 'B', 'D', 'K')); // make these values into the array keys

foreach($sheetData as $k=>$v) { // $v is the array you want to filter
    $keep = array_intersect_key($v,$col_keep); // intersect using the keys
    print_r($keep);
}

Thanks mac_gyver!!!! Seem simple, think I was overthinking it with the multidimensional array and couldn't get the right combo in the code to work.  Thanks again!

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.