从多维数组中取消设置变量特定键

时间:2017-11-09 16:11:06

标签: php arrays multidimensional-array

我有不同的多维数组,其中包含不同的键和值:

$array_1 = array('cars' => array('audi' => array('a3' => array('one', 'two', 'three'), 'a5' => array('five', 'six', 'seven')), 'mercedes' => array('type_1' => array('submodel' => array('whatever'))), 'other_cat' => array('different_things')));

然后我想取消设置一个特定的密钥,例如:

unset($array_1['cars']['audi']['a5']);

现在我喜欢“拆分”,以获得关键变量。

$to_unset = ['cars']['audi']['a5']; 

如何取消设置该特定(变量!)键?

亚伦

3 个答案:

答案 0 :(得分:1)

一个简单的实用工具,可以避免意外删除不存在的数组键:

function removeArrayKey($path, &$array ) {

    $array_temp = &$array;
    $previousItem = null;

    $path_bits = explode( ".", $path );

        foreach( $path_bits as &$path_bit ) {

           if( !isset( $array_temp[ $path_bit ] ) ) {
                  die("Error" . $path_bit);
                   //throw new Exception( "Path does not exist in array" );
            }

            $previousItem = &$array_temp;
            $array_temp = &$array_temp[ $path_bit ];

        }

        if( isset( $previousItem ) ) {

             unset( $previousItem[ $path_bit ] );

        }

        return $array;

}

要使用此功能,只需使用removeArrayKey( "cars.mercedes.cars", $array_1 );并将每个数组索引与.

分开

答案 1 :(得分:0)

因此,当我看到您的问题时,您希望将数组路径保存到变量中。您可以通过两种不同的方式解决此问题:

将每个键保存到变量

我会这样做,如果我的数组结构看起来总是一样的(例如[cars] [type] [model])。您可以将要删除的密钥保存到变量中:

$cars = 'cars';
$type = 'audi';
$model = 'a5';

unset($array_1[$cars][$type][$model]);

这将在for(每个)循环中表现出色。

将密钥保存到数组

此方法可以解决您的问题,但这不是最佳选择。您可以将所有要设置的键保存到数组中。这种方式可能会导致许多错误,如果这种方式是您的解决方案,您应该重新考虑数组结构。

// arrays start at 0
$to_unset = [
    0 => 'cars',
    1 => 'audi',
    2 => 'a5',
];

unset($array_1[$to_unset[0]][$to_unset[1]][$to_unset[2]]);

此处另一个可能的选项是命名$ to_unset数组的键。

// arrays start at 0
$to_unset = [
    'cars' => 'cars',
    'type' => 'audi',
    'model' => 'a5',
];

unset($array_1[$to_unset['cars']][$to_unset['type']][$to_unset['model']]);

答案 2 :(得分:0)

您可以使用eval,但不推荐

    for ((i=0 ; i<${#arraytest[*]} ; i++))
      do
           echo ${arraytest[${i}]} | sed "s/$/|${string}/"
     done