Как заполнить декартово произведение многомерного массива

У меня есть такой массив:

$string = array(
"name" => "Mike",
"country"=> "UK",
"prefers" => array( "coffee", "milk", "bananas"),
"age"=> "25""children => array( Jack, Jill)
);

Как мне заполнить «таблицу» всеми параметрами, чтобы иметь структуру, которая бы выглядела так:

array1 = (Mike, UK, coffee, 25, Jack)
array2 = (Mike, UK, milk, 25, Jack)
array3 = (Mike, UK, bananas, 25, Jack)
array4 = (Mike, UK, coffee, 25, Jill)
array5 = (Mike, UK, milk, 25, Jill)
array6 = (Mike, UK, bananas, 25, Jill)

Здесь мне нужно иметь 1 * 1 * 3 * 1 * 2 = 6 строк и структуру из 5 столбцов, без пустых ячеек.

2

Решение

Я испортил, впервые, потому что мои решения не генерировали все перестановки. Вот еще один шаг, который должен быть правильным общим решением:

function arrayCrossProduct( array $data ) {
$rowCount = 1; // keep track of total rows we need to generate

// the reference is just used for convenience to cast to and reset the array
foreach( $data as &$datum ) {
$datum = (array) $datum; // cast to array
$rowCount *= count( $datum ); // multiply total rows with current element count
reset( $datum ); // reset the array, just to be sure
}

$result = array();
while( $rowCount-- > 0 ) {
$row = array();
foreach( $data as &$datum ) {  // reference necessary to keep track of array pointer
$row[] = current( $datum ); // generate new row
}
$result[] = $row; // add row to result

// find the first element that is advanceable
foreach( $data as &$datum ) {  // reference necessary to keep track of array pointer
next( $datum );

// if it advanced/not at the end: break
if( !is_null( key( $datum ) ) ) {
break;
}

reset( $datum ); // else rewind the array and continue
}
}

return $result;
}

Вы можете просмотреть это работает онлайн, с некоторыми образцами данных и форматированным выводом.

1

Другие решения

Ваш вопрос очень расплывчатый, но если это то, что я считаю, то ответ будет использовать json_encode($string,TRUE);

0

Вы ищете что-то подобное?

   <?php
// Print the array in a nice form
function print_r2 ($Array) {
echo "<pre>";
print_r($Array);
echo "</pre>"; }$array1[] = array(Mike, UK, coffee, 25, Jack);
$array1[] = array(Mike, UK, milk, 25, Jack);
$array1[] = array(Mike, UK, bananas, 25, Jack);
$array1[] = array(Mike, UK, coffee, 25, Jill);
$array1[] = array(Mike, UK, milk, 25, Jill);
$array1[] = array(Mike, UK, bananas, 25, Jill);foreach($array1 as $array6){
//first create multidimentional arrays to separate duplicates using values as keys.
if(!in_array($array6[2],$parray[$array6[0]][$array6[1]][$array6[3]][prefers])) {
$parray[$array6[0]][$array6[1]][$array6[3]][prefers][]=$array6[2];}

if(!in_array($array6[4],$parray[$array6[0]][$array6[1]][$array6[3]][children])) {
$parray[$array6[0]][$array6[1]][$array6[3]][children][]=$array6[4];}

}
print_r2($parray);

foreach($parray as $name => $value){
$array[name] = $name;
foreach($value as $country => $value2) {
$array[country] = $country;
foreach($value2 as $age => $value3  ){
$array[prefers] = $value2[$age][prefers];
$array[age] = $age;
$array[children] = $value2[$age][children];
}

}

}
print_r2($array);
//OR
echo json_encode($array);
?>
0

Я думаю, что это больше похоже на то, что вы ищете с вашим пересмотренным вопросом. Я только что добавил противоположную цель внизу моего первоначального ответа.

       <?php
// Print the array in a nice form
function print_r2 ($Array) {
echo "<pre>";
print_r($Array);
echo "</pre>"; }$array1[] = array(Mike, UK, coffee, 25, Jack);
$array1[] = array(Mike, UK, milk, 25, Jack);
$array1[] = array(Mike, UK, bananas, 25, Jack);
$array1[] = array(Mike, UK, coffee, 25, Jill);
$array1[] = array(Mike, UK, milk, 25, Jill);
$array1[] = array(Mike, UK, bananas, 25, Jill);foreach($array1 as $array6){
//first create multidimentional arrays to separate duplicates using values as keys.
if(!in_array($array6[2],$parray[$array6[0]][$array6[1]][$array6[3]][prefers])) {
$parray[$array6[0]][$array6[1]][$array6[3]][prefers][]=$array6[2];}

if(!in_array($array6[4],$parray[$array6[0]][$array6[1]][$array6[3]][children])) {
$parray[$array6[0]][$array6[1]][$array6[3]][children][]=$array6[4];}

}
print_r2($parray);

foreach($parray as $name => $value){
$array[name] = $name;
foreach($value as $country => $value2) {
$array[country] = $country;
foreach($value2 as $age => $value3  ){
$array[prefers] = $value2[$age][prefers];
$array[age] = $age;
$array[children] = $value2[$age][children];
}

}

}
print_r2($array);
//OR
echo json_encode($array);

echo"<br />";echo"<br />";
//** now backwards**
echo"<br />";
echo"<br />";
$no=1;
foreach($array[children] as $children ) {
foreach($array[prefers] as $prefers ) {

print("array".$no." = (".$array[name].", ".$array[country].",".$prefers.",".$array[age].",".$children.")<br />\n");

$no++;
}
}?>
0