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