diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c
index 0b4b553d87540..2e03eac0f1b29 100644
--- a/ext/soap/php_encoding.c
+++ b/ext/soap/php_encoding.c
@@ -3584,6 +3584,11 @@ static encodePtr get_array_type(xmlNodePtr node, zval *array, smart_str *type)
soap_error0(E_ERROR, "Encoding: SoapVar has no 'enc_type' property");
}
cur_type = Z_LVAL_P(ztype);
+ if (cur_type == UNKNOWN_TYPE) {
+ /* Mimic guess_xml_convert() where we use the type of the data.
+ * UNDEFs are handled transparently as it will error out upon encoding the data. */
+ cur_type = Z_TYPE_P(Z_VAR_ENC_VALUE_P(tmp));
+ }
zval *zstype = Z_VAR_ENC_STYPE_P(tmp);
if (Z_TYPE_P(zstype) == IS_STRING) {
diff --git a/ext/soap/tests/bugs/gh20011.phpt b/ext/soap/tests/bugs/gh20011.phpt
new file mode 100644
index 0000000000000..cf40d813e6178
--- /dev/null
+++ b/ext/soap/tests/bugs/gh20011.phpt
@@ -0,0 +1,20 @@
+--TEST--
+GH-20011 (Array of SoapVar of unknown type causes crash)
+--EXTENSIONS--
+soap
+--FILE--
+ 'test://', 'uri' => 'http://soapinterop.org/']);
+$client->echoStringArray($array);
+?>
+--EXPECT--
+
+