Получение данных из массивов - PullRequest
0 голосов
/ 04 августа 2020

Я выполняю вызов API и получаю некоторые данные. Затем мне нужно получить эти данные и создать из них свой собственный массив. Однако я заметил небольшую проблему. Рассматриваемые данные имеют следующую структуру:

Array
(
    [Cost] => Array
        (
            [ID] => 4233
            [Description] => Something
            [Quantity] => 4
        )

)
Array
(
    [Cost] => Array
        (
            [0] => Array
                (
                    [ID] => 1233
                    [Description] => Something
                    [Quantity] => 1           
                )

            [1] => Array
                (
                    [ID] => 2344
                    [Description] => Something
                    [Quantity] => 2
                )

        )

)

Теперь проблема в том, что внутри массива Cost иногда есть дополнительные массивы, как во втором примере. Мой исходный код был таким:

if (!empty($costs['Costs'])) {
    foreach ($costs['Costs'] as $field) {
        foreach ($field as $type) {
            print_r(is_array($type));
            $jData['costsInfo'][] = $type;
        }
    }
}

И это отлично работает для Cost с внутренними массивами, как в примере 2. Но когда этого не происходит, он присваивает значение нумерованному индексу. Я пробовал проверить, является ли это массивом, но он всегда, кажется, возвращает истину.

Результат, который мне нужен, выглядит примерно так

[costsInfo] => Array
(
    [0] => Array
        (
            [ID] => 4233
            [Description] => Something
            [Quantity] => 4   
        )

)
[costsInfo] => Array
(
    [0] => Array
        (
            [ID] => 1233
            [Description] => Something
            [Quantity] => 1       
        )

    [1] => Array
        (
            [ID] => 2344
            [Description] => Something
            [Quantity] => 2

        )

)

На данный момент я вижу это

[costsInfo] => Array
(
    [0] => 4233
    [1] => Something
    [2] => 4
)
[costsInfo] => Array
(
    [0] => Array
        (
            [ID] => 1233
            [Description] => Something
            [Quantity] => 1       
        )

    [1] => Array
        (
            [ID] => 2344
            [Description] => Something
            [Quantity] => 2

        )

)

Итак, как лучше всего поступить, если исходный массив не имеет внутренних массивов?

Спасибо

Ответы [ 2 ]

1 голос
/ 04 августа 2020

Думаю, код довольно понятен. Итак, я не предоставил никакого описания. Если у вас есть вопросы, задавайте их в комментариях. Я отредактирую ответ.

<?php

// utility of function to check if
// $arr is sequential or not
// i.e. on contains 0, 1, ..., count($arr) -1 neumeric keys
function isSequential($arr) {
    if(count($arr) === 0) return false;
    return array_keys($arr) === range(0, count($arr) - 1);
}

function getCostsInfo($input) {
    $costs = $input["cost"];

    $costsInfo = [];
    
    if(isSequential($costs)) {
        foreach($costs as $cost) {
            $costsInfo[] = $cost;
        }
    } else {
        if(isset($costs["id"]) && isset($costs["description"]) && isset($costs["quantity"])) {
            $costsInfo[] = [
                "id" => $costs["id"],
                "description" => $costs["description"],
                "quantity" => $costs["quantity"]
            ];
        }
    }

    return $costsInfo;
}


$input1 = [
    "cost" => [
        "id" => 4233,
        "description" => "something",
        "quantity" => 4
    ]
];

$input2 = [
    "cost" => [
        [
            "id" => 1233,
            "description" => "something",
            "quantity" => 1
        ],
        [
            "id" => 2344,
            "description" => "something",
            "quantity" => 2
        ]
    ]
];

$costsInfo1 = getCostsInfo($input1);

echo "costsInfo1: ";
var_dump($costsInfo1);

$costsInfo2 = getCostsInfo($input2);
echo "costsInfo2: ";
var_dump($costsInfo2);
?>

Результат будет:

costsInfo1: array(1) {
  [0]=>
  array(3) {
    ["id"]=>
    int(4233)
    ["description"]=>
    string(9) "something"
    ["quantity"]=>
    int(4)
  }
}
costsInfo2: array(2) {
  [0]=>
  array(3) {
    ["id"]=>
    int(1233)
    ["description"]=>
    string(9) "something"
    ["quantity"]=>
    int(1)
  }
  [1]=>
  array(3) {
    ["id"]=>
    int(2344)
    ["description"]=>
    string(9) "something"
    ["quantity"]=>
    int(2)
  }
}
1 голос
/ 04 августа 2020

Должно работать что-то вроде этого:

$jData['costsInfo'] = array();
if (!empty($costs['Cost']) && is_array($costs['Cost'])) {
    if (array_key_first($costs['Cost']) === 0) {
        $jData['costsInfo'] = $costs['Cost'];
    } else {
        $jData['costsInfo'][] = $costs['Cost'];
    }
}

По сути, это просто проверка первого ключа для этих Cost массивов. Если это 0, то мы предполагаем, что их должно быть несколько, и можем добавить всю «коллекцию массивов» к нашему выводу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...