1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
| $fruits = array(
0 => 'noix',
1 => 'orange',
2 => 'citron',
3 => 'noisette',
4 => 'pomme',
5 => 'poire',
6 => 'noisette'
);
$fruitsWithoutAssociation = $fruits;
$collections = array(
0 => array('orange'),
1 => array('orange', 'citron', 'pamplemousse'),
2 => array('noix', 'noisette', 'amande'),
3 => array('noix', 'pomme', 'amande'),
4 => array('noix', 'noisette', 'amande'),
5 => array('noix'),
6 => array('poire')
);
function checkUniqueValue( $arrayOfArray ){
$simpleArray = array();
$uniqueArray = array();
foreach( $arrayOfArray as $array ){
foreach($array as $v){
$simpleArray[$v] = (!isset($simpleArray[$v]));
}
}
foreach( $simpleArray as $k=>$v ){
if($v){
$uniqueArray[] = $k;
}
}
return $uniqueArray;
}
function cleanArrayFromValue(&$collections, $value){
foreach( $collections as $k => $collection ){
$key = array_search( $value,$collection );
if($key !== false) unset( $collections[$k][$key] );
}
}
function containMonoArray(&$collections){
foreach( $collections as $collection ){
if(sizeof($collection) == 1) return true;
}
return false;
}
function containOnlyEmptyArray(&$collections){
foreach( $collections as $collection ){
if(sizeof($collection) != 0) return false;
}
return true;
}
function removeUselessValue( &$collections, $values ){
foreach( $collections as $k=>$collection ){
foreach( $collection as $k2=>$v ){
if( !in_array( $v, $values )){
unset( $collections[$k][$k2] );
}
}
}
}
removeUselessValue( $collections, $fruits );
$result = array();
do{
do{
do{
foreach( $collections as $k=>$collection ){
// On vérifie si un des tableau demande une valeur précise
if( sizeof($collection) == 1 ){
foreach( $collection as $c ){
if(!array_key_exists ($k, $result)){
$result[$k] = $c;
// remove it from $fruitsWithoutAssociation
foreach( $fruitsWithoutAssociation as $k2=>$fruit){
if( $c == $fruit ){
unset($fruitsWithoutAssociation[$k2]);
break;
}
}
if(!in_array($c,$fruitsWithoutAssociation) ){
cleanArrayFromValue($collections, $c);
}else{
$collection[$k] = array();
}
}
}
}
}
}while( containMonoArray($collections) );
// Sinon on cherche un valeur représentée une seule fois dans les tableaux (si c'est le cas et que cette valeur est présente dans la liste de fruit, on l'associe )
if( !containOnlyEmptyArray($collections) ){
$uniqueValues = checkUniqueValue($collections);
foreach ( $uniqueValues as $uniqueValue){
foreach( $collections as $k=>$collection ){
if( in_array( $uniqueValue, $collection )){
$result[$k] = $uniqueValue;
cleanArrayFromValue($collections, $uniqueValue);
break;
}
}
};
}
}while( containMonoArray($collections) );
if( !containOnlyEmptyArray($collections) ){
// Choisir une valeur dans collections et l'associer à un fruits puis on nettoye les collections
$valueSelected = false;
foreach( $collections as $k=>$collection ){
if( !$valueSelected && sizeof($collection) != 0 ){
foreach( $collection as $k2=>$c ){
if(!array_key_exists ($k, $result)){
$result[$k] = $c;
foreach( $fruitsWithoutAssociation as $k2=>$fruit){
if( $c == $fruit ){
unset($fruitsWithoutAssociation[$k2]);
break;
}
}
if(!in_array($c,$fruitsWithoutAssociation) ){
cleanArrayFromValue($collections, $c);
}else{
unset($collection[$k][$k2]);
}
$valueSelected = true;
break;
}
}
}
}
}
}while( !containOnlyEmptyArray($collections) ); |
Partager