Найти ключ массива и получить значения в php - PullRequest
0 голосов
/ 17 апреля 2020

joomla / virtuemart / складные настраиваемые поля

У меня есть многомерный массив (virtuemart $ product), и я хочу получить фондовые значения дочерних продуктов (и array_sum).

Есть ли более простой способ сделать это? позиция также может измениться. Что-то вроде find_key -> get array_sum

if (array_key_exists('customfieldsSorted', $product)) {
    echo array_sum(array_column(
        $product->customfieldsSorted['addtocart'][0]->stockableCombinations->combinations,
        'stock'
    ));
}
//return 999 - this is the value I need


//array
    if (array_key_exists('customfieldsSorted', $product)) {
        print_r($product->customfieldsSorted['addtocart'][0]->stockableCombinations->combinations);
    }

//return

    Array
    (
        [0] => Array
            (
                [product_id] => 72
                [customfield_ids] => Array
                    (
                        [0] => 13
                    )

                [stock] => 99
            )

        [1] => Array
            (
                [product_id] => 73
                [customfield_ids] => Array
                    (
                        [0] => 14
                    )

                [stock] => 99
            )

        [n] => Array
            (......)
    )

1 Ответ

2 голосов
/ 17 апреля 2020

Ну, я думаю, что ваше решение не было плохим. Но это может помочь вам улучшить его читабельность:

<?php declare(strict_types=1);

function sumColumns(array $list, string $column): int {
    return array_sum(array_column($list, $column));
}

function sumStock(array $fields): int {
    $list = $fields[0]->stockableCombinations->combinations;
    return sumColumns($list, 'stock');
}

// Usage example:
/** This works as a "fixture function" to create a class with some data */
function newProduct(): \stdClass {
    $combinations = new \stdClass();
    $combinations->combinations = [['stock' => 10],['stock' => 20],/*...*/];

    $cart = new \stdClass();
    $cart->stockableCombinations = $combinations;

    $product = new \stdClass();
    $product->customfieldsSorted = ['addtocart' => [$cart]];
    return $product;
}

$product = newProduct();
$stock = 0;
if (isset($product->customfieldsSorted['addtocart'])) {
    $stock = sumStock($product->customfieldsSorted['addtocart']);
}
var_dump($stock); //$stock === 30 
...