Raketenwilli: Anderer Vorschlag, was zum Spielen

Beitrag lesen

Wie, wann und warum array_count_values() untauglich ist und sogar falsche Ergebnisse liefert habe ich gezeigt.

Als „Raketenwilli“ will ich natürlich so ein Problem gelöst sehen… Hier mein erster Ansatz:

<?php
$array = array("1", "hello", 1, "world", "hello");
echo "Das Array:\n";
var_dump( $array );

$strong_counter =  New strong_array_values_counter( $array );
echo "\nDas Objekt:\n";
var_dump( $strong_counter);

echo "Werte und Vorkommen in zwei Arrays:\n";
var_dump( $strong_counter->get_Keys_Values() );

echo "\nVorkommen von 1 und \"1\":\n";
echo 'STR  "1":' . $strong_counter->get_Counts_By_Value( "1" ) . PHP_EOL;
echo 'INT   1 :' . $strong_counter->get_Counts_By_Value( 1 ) . PHP_EOL;



class strong_array_values_counter {
	protected $keys=[];
	protected $counts=[];
	
	function __construct( $arr ) {
		foreach ( $arr as $v ) {
			if ( !  in_array( $v, $this->keys, true ) )  {
				$pos = count( $this->keys ) ;
				$this->keys[$pos] = $v;
				$this->counts[$pos] = 1;
			} else {
				$pos = $this->findPos( $v );
				$this->counts[$pos]++;
			}
		}
	}
	private function findPos( $v ) {
		for ( $i=0; $i < count( $this->keys ); $i++ ) {
			if ( $this->keys[$i] === $v ) {
				return $i;
			}
		} 
		return false;
	}
	
	public function get_Keys_Values() {
		$ret=[];
		for ( $i=0; $i < count( $this->keys); $i++ ) {
			$ret[] = [ $this->keys[ $i ], $this->counts[ $i ] ];
		}
		return $ret;
	} 
	
	public function get_Counts_By_Value( $v ) {
		$pos = $this->findPos( $v );
		return $this->counts[ $pos ];
	} 	
	
}

Putput:

Das Array:
array(5) {
  [0]=>
  string(1) "1"
  [1]=>
  string(5) "hello"
  [2]=>
  int(1)
  [3]=>
  string(5) "world"
  [4]=>
  string(5) "hello"
}

Das Objekt:
object(strong_array_values_counter)#1 (3) {
  ["keys":protected]=>
  array(4) {
    [0]=>
    string(1) "1"
    [1]=>
    string(5) "hello"
    [2]=>
    int(1)
    [3]=>
    string(5) "world"
  }
  ["types":protected]=>
  array(0) {
  }
  ["counts":protected]=>
  array(4) {
    [0]=>
    int(1)
    [1]=>
    int(2)
    [2]=>
    int(1)
    [3]=>
    int(1)
  }
}
Werte und Vorkommen in zwei Arrays:
array(4) {
  [0]=>
  array(2) {
    [0]=>
    string(1) "1"
    [1]=>
    int(1)
  }
  [1]=>
  array(2) {
    [0]=>
    string(5) "hello"
    [1]=>
    int(2)
  }
  [2]=>
  array(2) {
    [0]=>
    int(1)
    [1]=>
    int(1)
  }
  [3]=>
  array(2) {
    [0]=>
    string(5) "world"
    [1]=>
    int(1)
  }
}

Vorkommen von 1 und "1":
STR  "1":1
INT   1 :1