11

私はたくさんの答えを探してきましたが、どれも私のために働いていません。

$quantitiesこれは私のアレイに割り当てられたデータです:

Array(
    [10] => Array([25.00] => 1)
    [9] => Array([30.00] => 3)
    [8] => Array([30.00] => 4)
    [12] => Array([35.00] => )
    [1] => Array([30.00] => )
    [2] => Array([30.00] => )
)

[12] [1]他のすべてを保持し[2]ながら、空の値を持つサブ配列を削除する方法を探しています。

望ましい結果:

Array(
    [10] => Array([25.00] => 1)
    [9] => Array([30.00] => 3)
    [8] => Array([30.00] => 4)
)

公式のphpドキュメントで多くの関数を試しましたが、どれも機能しませんでした。

私はこれを使用しました:

function array_filter_recursive($array, $callback = null) {
    foreach ($array as $key => & $value) {
        if (is_array($value)) {
            $value = array_filter_recursive($value, $callback);
        } else {
            if ( ! is_null($callback)) {
                if ( ! $callback($value)) {
                    unset($array[$key]);
                }
            } else {
                if ( ! (bool) $value) {
                    unset($array[$key]);
                }
            }
        }
    }
    unset($value);
    return $array;
}

ただし、サブ配列内の要素を削除するだけです。サブアレイを完全に削除する必要があります。

私はこれを望んでいません:

Array(
    [10] => Array([25.00] => 1)
    [9] => Array([30.00] => 3)
    [8] => Array([30.00] => 4)
    [12] => Array()
    [1] => Array()
    [2] => Array()
)
4

8 に答える 8

18

少し遅れましたが、同じ答えを探している人に役立つかもしれません。私はこの非常に単純なアプローチを使用しました。

  1. 値を含まないネストされた配列からすべてのキーを削除してから、
  2. 空のネストされた配列をすべて削除します。

$postArr = array_map('array_filter', $postArr);
$postArr = array_filter( $postArr );
于 2013-09-13T22:16:35.850 に答える
6

私の場合、次の関数が機能しました。シンプルな再帰関数を使用して、多次元 PHP 配列からすべての空の要素を削除できます。

function array_filter_recursive($input){
    foreach ($input as &$value){
        if (is_array($value)){
            $value = array_filter_recursive($value);
        }
    }
    return array_filter($input);
}

次に、この関数を呼び出す必要があります。

$myArray = array_filter_recursive($myArray);
于 2015-09-03T18:23:18.643 に答える
2

これがまさにあなたが探しているものかどうかはわかりません。

function array_remove_null($array) {
    foreach ($array as $key => $value)
    {
        if(is_null($value))
            unset($array[$key]);
        if(is_array($value))
            $array[$key] = array_remove_null($value);
    }
    return $array;
}

更新 (訂正):

function array_remove_null($array) {
    foreach ($array as $key => $value)
    {
        if(is_null($value))
            unset($array[$key]);
        if(is_string($value) && empty($value))
            unset($array[$key]);
        if(is_array($value))
            $array[$key] = array_remove_null($value);
        if(isset($array[$key]) && count($array[$key])==0)
            unset($array[$key]);
    }
    return $array;
}

これをより適切に確認してより堅牢にすることが、解決策に役立つと確信しています。

于 2012-04-18T17:26:03.130 に答える
0
$newArray = array_map('array_filter', $array);

このsintaxは仕事であり、非常に感謝しています..

于 2014-11-13T09:47:01.610 に答える
-1

これにより、多次元配列で null 値を持つすべてのアイテムが再帰的に削除されます。PHP >= 5.6 で動作します。すべての「空の」値を削除する場合は、に置き換え!is_null($value)ます!empty($value)

function recursivelyRemoveItemsWithNullValuesFromArray(array $data = []): array
{
    $data = array_map(function($value) {
        return is_array($value) ? recursivelyRemoveItemsWithNullValuesFromArray($value) : $value;
    }, $data);

    return array_filter($data, function($value) {
        return !is_null($value);
    });
}
于 2017-06-08T13:19:52.890 に答える