2015-02-05 1 views
0

У меня есть многомерный массив как -Я хочу, чтобы алгоритм PHP для следующего выпуска

array(
    "C" => array('A','A1','A2','B',B1'), 
    "C1" => array('A','A1','A2','B',B1'), 
    "A" => array('B','B1','C',C1'), 
    "B1" => array('A','A1','A2','C',C1'), 
    "B1" => array('A','A1','A2','C',C1'), 
    "A2" => array('B','B1','C',C1'), 
    "A1" => array('B','B1','C',C1') 
); 

Я хочу скрипт, который будет присвоить значение из заданного массива для каждого ключа,

Результат будет be like -

C A/A1/A2/B/B1 - A //I can assign any value from A/A1/A2/B/B1 
C1 A/A1/A2/B/B1 - A1 //Once A is assigned for the above key then C1 will get value from A1/A2/B/B1 skipping the 'A' which is assigned to key 'C' 
A B/B1/C/C1  - B //Now A will get value from B/B1/C/C1 
B1 A/A1/A2/C/C1 - A2 //B1 will get value from A2/C/C1 
B A/A1/A2/C/C1 - C //Likewise all the values will be assigned uniquely 
A2 B/B1/C/C1  - B1 
A1 B/B1/C/C1  - C1 

Условие состоит в том, что одно и то же значение не будет присвоено нескольким клавишам, то есть все ключи будут иметь разное значение. (Проверьте полученный результат, чтобы знать, что именно должен быть назначен)

+0

И где вы застряли? Выглядит довольно прямо. Используйте поиск для «взятых» значений и назначьте первый, которого нет ... – Sirko

+0

Я сделал то же самое, но проблема возникает в некоторых случаях, поскольку A1 может получать только значение из B/B1/C/C1, но если они уже привязаны к вышеуказанным клавишам, тогда он возвращает ошибку, поэтому мне нужен какой-то скрипт, чтобы одинаково назначать все значения ключам однозначно. (На самом деле есть 7 ключей - 7 значений, поэтому мне нужно их однозначно назначать). –

+0

Затем взгляните на двухпартийные алгоритмы согласования. Если для частей бота достаточно, это может дать вам максимально возможное совпадение. – Sirko

ответ

0
$data = array(
    "C" => array('A','A1','A2','B','B1'), 
    "C1" => array('A','A1','A2','B','B1'), 
    "A" => array('B','B1','C','C1'), 
    "B1" => array('A','A1','A2','C','C1'), 
    "B" => array('A','A1','A2','C','C1'), 
    "A2" => array('B','B1','C','C1'), 
    "A1" => array('B','B1','C','C1') 
); 

$assigned = array(); 
$result = array(); 
foreach($data as $k => $v) { 
    for($i=0;$i<count($v);$i++) { 
    if (!in_array($v[$i],$assigned)) { 
     $assigned[] = $v[$i]; 
     $result[$k] = $v[$i]; 
     break; 
    } 
    } 
} 
var_dump($result); 

выход:

array(7) { 
    ["C"]=> 
    string(1) "A" 
    ["C1"]=> 
    string(2) "A1" 
    ["A"]=> 
    string(1) "B" 
    ["B1"]=> 
    string(2) "A2" 
    ["B"]=> 
    string(1) "C" 
    ["A2"]=> 
    string(2) "B1" 
    ["A1"]=> 
    string(2) "C1" 
} 

это решение не является хорошим enaugh;) если определить C1 как массив («A»), то C1 не будет иметь значения, чтобы предотвратить попытку проверить, есть ли возможность назначать значения в другой конфигурации.

$data = array(
    "C" => array('A','A1'), 
    "C1" => array('A'), 
    "A" => array('B','B1','C','C1'), 
    "B1" => array('A','A1','A2','C','C1'), 
    "B" => array('A','A1','A2','C','C1'), 
    "A2" => array('B'), 
    "A1" => array('B','B1','C','C1') 
); 

$assigned = array(); 
$keys = array_keys($data); 
for($i=0;$i<count($keys);$i++) { 
    getValue($data, $assigned, $keys, $i); 
} 
function getValue($data, &$assigned, $keys, &$i, $x = null) { 
    $j = $x === null ? 0 : array_search($x, $data[$keys[$i]]) +1; 
    for($j; $j<count($data[$keys[$i]]); $j++) { 
     $v = $data[$keys[$i]][$j]; 
     if(!in_array($v, $assigned)) { 
     $assigned[$keys[$i]] = $v; 
     return; 
     } 
    } 
    $i--; 
    if ($i < 0) { 
     throw new Exception('no solutions'); 
    } 
    $val = $assigned[$keys[$i]]; 
    $assigned[$keys[$i]] = null; 
    getValue($data, $assigned, $keys, $i, $val); 
} 
var_dump($assigned); 
+0

Можете ли вы проверить этот массив -> 'array ( \t« A »=> массив ('B', B1 ',' C ', C1'), \t «B» => массив ('A', 'A1', 'A2', 'C', C1 '), \t "C" => массив (' A ',' A1 ',' A2 ',' B ', B1'), \t "B1" => массив ('A', 'A1', 'A2', 'C', C1 '), \t "A1" => массив (' B ',' B1 ',' C ', C1'), \t "C1" => массив ('A', 'A1', 'A2', 'B', B1 '), \t "A2" => array (' B ',' B1 ',' C ', C1') ); 'Спасибо. –

+0

'массива (7) { [ "А"] => строка (1) "Б" [ "В"] => строка (1) "А" [ "С"] => строка (2) "А1" [ "В1"] => строка (2) "А2" [ "А1"] => строка (1) "С" [ "С1"] => строка (2) "B1" ["A2"] => строка (2) "C1" } ' – szapio

+0

Спасибо, что работает! :) –

Смежные вопросы