У меня такой массив:
[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, и код работал нормально. $ type - массив SimpleXML $ out - массив результатов
foreach ( (array) $type as $index => $node )
$out[$index] = ( is_object ( $node ) ) ? xml2array ( $node ) : $node;
Вы можете использовать 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)
}
}
*/
Вам нужно создать новый индекс или получить доступ к нему, если он уже был создан, а затем создать другой элемент под ним с существующим ключом и присвоить значение:
$quantity = array();
foreach($fruit as $key => $value) {
$quantity[Finder($key)][$key] = $value;
}
Предполагается, что Finder()
возвращает строку типа randomArrayName1
.
$quantity = array();
назад, по-видимому, вы уже определили его как строку где-то.