如何从PHP数组中取消设置数字索引元素?

如何从PHP数组中取消设置数字索引元素?

问题描述:

I have a collection of array it contains both numeric index as well as non numeric. I want to unset all the numeric indexes.

My array is something like this .

Array
(

    [554] => Array
        (
            [0] => 554
            [1] => Jiaqi Zheng
            [2] => Female
            [3] => 28
            [4] => Table Tennis
            [5] => 
            [6] => 
            [7] => 
            [8] => 
            [rank] => 554
            [athlet_name] => Jiaqi Zheng
            [gender] => Female
            [sport] => Table Tennis
        )

    [555] => Array
        (
            [0] => 555
            [1] => Zach Ziemek
            [2] => Male
            [3] => 23
            [4] => Athletics
            [5] => 
            [6] => 
            [7] => 
            [8] => 
            [rank] => 555
            [athlet_name] => Zach Ziemek
            [gender] => Male
            [sport] => Athletics
        )
)

Here i have to unset all the numeric index .

I used unset like this and its working fine for me .

unset(
                     $history_years_wise_country_wise_details_arr[     $history_years_wise_country_wise_details_info[0]][0],
                      $history_years_wise_country_wise_details_arr[$history_years_wise_country_wise_details_info[0]][1],
                      $history_years_wise_country_wise_details_arr[$history_years_wise_country_wise_details_info[0]][2],
                      $history_years_wise_country_wise_details_arr[$history_years_wise_country_wise_details_info[0]][3],
                      $history_years_wise_country_wise_details_arr[$history_years_wise_country_wise_details_info[0]][4],
                      $history_years_wise_country_wise_details_arr[$history_years_wise_country_wise_details_info[0]][5],
                      $history_years_wise_country_wise_details_arr[$history_years_wise_country_wise_details_info[0]][6],
                      $history_years_wise_country_wise_details_arr[$history_years_wise_country_wise_details_info[0]][7],
                      $history_years_wise_country_wise_details_arr[$history_years_wise_country_wise_details_info[0]][8]
                      );

Is there any way I will reduce the lines of codes? here 0 to 8 are in one series.

Can I unset all index in one line of code , as all are numeric?

Is it possible to use regular expression instead?

I want something like

unset(
                     $history_years_wise_country_wise_details_arr[     $history_years_wise_country_wise_details_info[0]][anything_which_will_take_index_from_0_to_8]);

Any suggestions?

Thank you

You could use array_filter() with is_string() function as its callback function:

$array = array_filter($array, 'is_string', ARRAY_FILTER_USE_KEY);

You shoud used foreach loop with is_numeric function like

foreach ($your_array as $key => $value) {
    if (!is_numeric($key)) {
        unset($arr[$key]);
    }
}

i think there is no need of any regular expression

Use looping.

foreach ($array as $key => $value) {
    if (is_numeric ($key)) {
        unset($array [$key]);
    }
}

Or use array_filter

$filtered = array_filter(
    $array,
    function ($key) {
        return !is_numeric($key);
    },
    ARRAY_FILTER_USE_KEY
);

Since you have array inside array first you need to use array_map() and then traverse through array using array_filter(),

considering $array as your array:

$resultData = array_map([$this, 'allData'], $array);

 public function allData($data)
 {
    $numericKeys = array_filter(array_keys($data), function ($k) {
        return is_int($k);
    });
    // Updated Code
    $arrayKeys = array_diff(array_keys($data),$numericKeys);
    return array_intersect_key($data,array_flip($arrayKeys));
 }