На самом деле я оказался в подобной ситуации, пытаясь взять массив и разобрать его в XML. Имена элементов XML не могут начинаться с цифр, и фрагменты кода, которые я обнаружил, неправильно обрабатывали массивы с числовыми индексами.
Подробности по моей конкретной ситуации ниже
Ответ, предоставленный выше @null (http: // stackoverflow .com / a / 173589/293332), на самом деле был чертовски близок. Я был встревожен, что за него проголосовали: те, кто не понимает регулярное выражение, ведут очень расстраивающие жизни.
В любом случае, исходя из его ответа, вот что я закончил:
/**
* Checks if an array is associative by utilizing REGEX against the keys
* @param $arr <array> Reference to the array to be checked
* @return boolean
*/
private function isAssociativeArray( &$arr ) {
return (bool)( preg_match( '/\D/', implode( array_keys( $arr ) ) ) );
}
Дополнительные сведения см. На страницах PCRE Escape и PCRE Syntax .
Моя особая ситуация
Вот пример массива, с которым я имею дело:
Случай А
return array(
"GetInventorySummary" => array(
"Filters" => array(
"Filter" => array(
array(
"FilterType" => "Shape",
"FilterValue" => "W",
),
array(
"FilterType" => "Dimensions",
"FilterValue" => "8 x 10",
),
array(
"FilterType" => "Grade",
"FilterValue" => "A992",
),
),
),
"SummaryField" => "Length",
),
);
Проблема в том, что ключ filter
является переменным. Например:
Дело Б
return array(
"GetInventorySummary" => array(
"Filters" => array(
"Filter" => array(
"foo" => "bar",
"bar" => "foo",
),
),
"SummaryField" => "Length",
),
);
Зачем мне доц. Проверка массива
Если массив, который я преобразовываю, похож на Случай A , то, что я хочу получить, будет:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<GetInventorySummary>
<Filters>
<Filter>
<FilterType>Shape</FilterType>
<FilterValue>W</FilterValue>
</Filter>
<Filter>
<FilterType>Dimensions</FilterType>
<FilterValue>8 x 10</FilterValue>
</Filter>
<Filter>
<FilterType>Grade</FilterType>
<FilterValue>A992</FilterValue>
</Filter>
</Filters>
<SummaryField>Length</SummaryField>
</GetInventorySummary>
... Однако, если массив, который я преобразовываю, похож на Случай B , я хочу получить следующее:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<GetInventorySummary>
<Filters>
<Filter>
<foo>bar</foo>
<bar>foo</bar>
</Filter>
</Filters>
<SummaryField>Length</SummaryField>
</GetInventorySummary>