lundi 7 septembre 2015

Php: turning it into a recursive function

I have currently two classes.

the ArrayCompare class:

<?php
namespace App\Tools\RegexExtract;

class ArrayCompare
{


    public function compare(Array $arrayToCompare)
    {

        $elementData = new ElementMetaData();
        $metaData = $elementData->extract($arrayToCompare[0], [], $initial=true);

        foreach ($arrayToCompare as $currentElement) {

            $metaData = $elementData->extract($currentElement, $metaData);

        }

        return $metaData;

    }

}

which uses the ElementMetaData classe

    <?php
/**
 * A class for extracting meta data from an element.
*/

namespace App\Tools\RegexExtract;

class ElementMetaData
{

    public function extract($element, $metaDataToCompare = [], $initial = false)
    {

        if ($initial == true) {
            $this->isInteger($element) ? $returnMetaData['isInteger'] = $this->isInteger($element) : null;
            $returnMetaData['length'] = $this->length($element);
        }

        else {

            $returnMetaData=$metaDataToCompare;


        if ($returnMetaData != []) {
            if (isset ($returnMetaData['isInteger']) && !$this->isInteger($element)) {
                unset($returnMetaData['isInteger']);

            }
            if (isset ($returnMetaData['length']) && $this->length($element) != $returnMetaData['length']) {
                unset($returnMetaData['length']);

            }

        }
        }

        return $returnMetaData;


    }

    private function isInteger($element)
    {
        return is_int($element);
    }

private function length($element)
{
    return strlen($element);

}

}

the basic functionality is:

given I have an array

$arr=[1,2,3];

I want to get the "similarities" between ALL Elements. According to a an array i Predefine...so this would deliver this result:

$metaArray=['isInteger'=>true,'length'=>1];

and this would deliver just length as similarity:

$arr=[1,2,'D'];
$metaArray=['length'=>1];

While this array would deliver an empty result []

$arr=[1,2,'3D']; // result is [] since not all integers or not all of same length.

Now my solution does not use recursive functions...but I am sure it can be used somehow.

Also, I want to add more "criteria"....So "isEmailAdress", "beginswithA"....etc....and this would make my if statements a horror....so what is the best strategy/design pattern to follow here?

Aucun commentaire:

Enregistrer un commentaire