2015-11-19 3 views
1

У меня есть массив как это:PHP Создание двухмерных массивов, зависящих от функции

[apple] => 11 
[pear] => 5 
[banana] => 3 
[cucumber] => 2 
[tomatoes] => 8 

Я хотел бы создать многомерный массив так:

[randomArrayName1] 
     [apple] => 11 
     [banana] => 3 
     [tomatoes] => 8 
[randomArrayName2] 
     [pears] => 5 
     [cucumber] => 2 

я написал ниже, но он не работает, и я понятия не имею, как сделать это сделать: то, что мне нужно это сделать

$quantity = array(); 
foreach($fruit as $key => $value) { 
    $quantity = Finder($key); 
} 

randomArrayName1 и randomArrayName2 будет генерироваться в зависимости от результата функции Finder(). В зависимости от этого результата я хочу, чтобы массив фруктов был создан как второй размерный массив.


Решение: Проблема заключалась в том, что функция, которую я написал, что созданные имена, как randomArrayName1, randomArrayName2 ... в действительности функция XML. Поэтому результатом этой функции не был массив, это был простой объект XML. Это вызвало проблему при создании многомерного массива. После того, как я выполнил приведенный ниже код, он преобразовал SimpleXML в Array, и код работал нормально. $ типа SimpleXML массив $ аута результат массив

foreach ((array) $type as $index => $node) 
    $out[$index] = (is_object ($node)) ? xml2array ($node) : $node; 

ответ

2

Вы можете использовать array_reduce. Требуется три аргумента: начальный массив для работы, функция, которая должна работать на каждом элементе (который, в свою очередь, требует двух аргументов: $carry, который является переменной, которая каждый раз проходит через функцию через оператор return и $item , на котором работает элемент массива) и, наконец, «начальное» значение для $carry внутри функции, которая в этом случае будет нашим многомерным массивом, который в конечном итоге возвращается.

Это пример, когда функция Finder возвращает ключ, основанный на том, является ли значение элементов в массиве нечетным или четным и соответственно сортирует значения.

Обратите внимание, что мы работаем на фруктах array_keys, так что у нас есть доступ как к ключу, так и к стоимости внутри нашего редуктора.

<?php 

$fruit = ['apple' => 11, 'pear' => 5, 'banana' => 3, 'cucumber' => 2, 'tomatoes' => 8]; 

function Finder($fruit) { 
    return $fruit % 2 == 0 ? 'even' : 'odd'; 
} 

$multi = array_reduce(array_keys($fruit), function($carry, $item) use ($fruit) { 
    $val = $fruit[$item]; 
    $carry[Finder($val)][$item] = $val; 
    return $carry; 
}, []); 

var_dump($multi); 

/* // output 
array(2) { 
    ["odd"]=> 
    array(3) { 
    ["apple"]=> 
    int(11) 
    ["pear"]=> 
    int(5) 
    ["banana"]=> 
    int(3) 
    } 
    ["even"]=> 
    array(2) { 
    ["cucumber"]=> 
    int(2) 
    ["tomatoes"]=> 
    int(8) 
    } 
} 
*/ 
+0

Отличный код, это идея, которую я использую для его кодирования, но я получаю эту ошибку. PHP Warning: file_get_contents (.blabla.com/xml/word1 word2 word3 word4. И это потому, что Finder ($ key) получает несколько значений во всех один раз. Мне нужно обеспечить, чтобы он получал только один раз за раз и структурировал массив соответственно. PS Извините, я ответил неправильно. –

2

Вам нужно создать новый индекс или доступ к нему, если он уже создан, а затем создать еще один элемент в соответствии с этим с существующим ключом и присвоить значение :

$quantity = array(); 
foreach($fruit as $key => $value) { 
    $quantity[Finder($key)][$key] = $value; 
} 

Это предполагает, что Finder() возвращает строку, как randomArrayName1.

+0

Я получаю эту ошибку -> [хх] PHP Warning: Illegal тип в /home/xx/public_html/xx.php смещение на линии 19 –

+0

Ну я добавил '$ количество = Array();' назад в, видимо, вы уже определили его как строку где-нибудь. – AbraCadaver

+0

'var_dump (Finder ($ key));' чтобы увидеть, что возвращается. – AbraCadaver

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