0

予測できない形式と長さの配列変数があります。例えば:

$arrayData = array(
   0 => (int) 100,
   1 => (date) 2012-12-01,
   2 => array(
       0 => (string) 'some string',
       1 => (int) 200,
   ),
   3 =>  (string) 'another string'
);

配列キーとその値を削除し、文字列データ型のみを保持する必要があります。

loop と gettype を使用する代わりに、その問題を解決する正しい方法を教えてくれる人がいるかもしれません。

結果は次のようになります。

$arrayData = array(
   2 => array(
       0 => (string) 'some string',
   ),
   3 =>  (string) 'another string'
);

また:

$arrayData = array(
   0 => (string) 'some string',
   1 =>  (string) 'another string'
);

または他の提案結果は大歓迎です。

4

4 に答える 4

3

ループを使用したくない場合は、array_walk_recursiveがあります。

<?php
$arrayData = array(
   0 => (int) 100,
   1 => (date) 2012-12-01,
   2 => array(
       0 => (string) 'some string',
       1 => (int) 200,
   ),
   3 =>  (string) 'another string'
);

array_walk_recursive($arrayData, 'test_print');

function test_print($value, $key)
{
   //your code to remove
}
于 2012-12-21T08:06:03.973 に答える
1

配列を反復処理し、gettype()関数を使用して配列項目を保持/削除できます。ただし、配列内の配列を処理するには再帰関数が必要です。&次のコード例では、慎重に 2 を使用していることに注意してください。

$arrayData = array(
    0 => (int) 100,
    1 => '2012-12-01',
    2 => array(
        0 => (string) 'some string',
        1 => (int) 200
    ),
    3 => (string) 'another string'
);
function remove_nonstring_recursive(&$array) {
    foreach ($array as $key => &$value) {
        $type = gettype($value);
        if ($type == "array") {
            remove_nonstring_recursive($value);
        } elseif ($type != "string") {
            unset($array[$key]);
        }
    }
}
remove_nonstring_recursive($arrayData);
var_dump($arrayData);
// array(3) {
//   [1]=>
//   string(10) "2012-12-01"
//   [2]=>
//   array(1) {
//     [0]=>
//     string(11) "some string"
//   }
//   [3]=>
//   string(14) "another string"
// }

元の回答 -array_walk_recursiveグローバル変数での使用

$arrayData = array(
    0 => (int) 100,
    1 => '2012-12-01',
    2 => array(
        0 => (string) 'some string',
        1 => (int) 200
    ),
    3 => (string) 'another string'
);
$arrayDataFiltered = array();
function remove_non_string($value, $key) {
    global $arrayDataFiltered;
    if (gettype($value) == "string") {
        $arrayDataFiltered[] = $value;
    }
}
array_walk_recursive($arrayData, "remove_non_string");
var_dump($arrayDataFiltered);
// array(3) {
//   [0]=>
//   string(10) "2012-12-01"
//   [1]=>
//   string(11) "some string"
//   [2]=>
//   string(14) "another string"
// }
于 2012-12-21T08:09:28.317 に答える
1

再帰なしでそれを行う方法はわかりませんが、array_walk_recursive の助けを借りて、次のことが必要になる可能性があります。

<?php
    $arrayData = array(
        0 => 100,
        1 => 2012-12-01,
        2 => array(
            0 => 'some string',
            1 => 200,
        ),
        3 =>  'another string'
    );

    $objTmp = (object) array('flat' => array());
    array_walk_recursive($arrayData, create_function('&$v, $k, &$t', '$t->flat[] = gettype($v);'), $objTmp);

    var_dump($objTmp->Flat);
?>
于 2012-12-21T08:13:47.403 に答える
0

foreach main arrrayを実行し、各値が文字列であるかどうかを確認します。最終的には、文字列のみの配列になります。

foreach($arrayData as $key => $value){
    if(is_string($value)){
    $new[] = $value;
    }
}

$new文字列のみが含まれます。

于 2012-12-21T08:03:53.080 に答える