PHP Создание двухмерных массивов в зависимости от функции

1

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

[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;
Теги:
arrays

2 ответа

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 Предупреждение: 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
    Я получаю эту ошибку -> [xx] Предупреждение PHP: Недопустимый тип смещения в /home/xx/public_html/xx.php в строке 19
  • 0
    Ну, я добавил $quantity = array(); назад, по-видимому, вы уже определили его как строку где-то.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню